1、在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
输入
7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
返回值
true
解
while(line=readline()){
var index=line.indexOf(",");
var left=parseInt(line.substring(0,index));
var right=JSON.parse(line.substring(index+1));
print(Find(left,right));
}
function Find(target, array)
{
// write code here
var arr = array;
for(var i=0;i<arr.length;i++){
for(var j=0;j<arr[i].length;j++){
if(arr[i][j] == target){
return true;
}
}
}
return false;
}
2、请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
解
//第一种
function replaceSpace(str) {
let temp = []
for (let i = 0; i<str.length; i++) {
if (str[i] === ' ') {
temp.push('%20')
} else {
temp.push(str[i])
}
}
return temp.join('')
}
// 第二种
function replaceSpace(str){
// write code here
return str.replace(/ /g, "%20");
}
3、输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
输入
{67,0,24,58}
返回值
[58,24,0,67]
解
function printListFromTailToHead(head)
{
var arrayList = [];
var node = head;
while(node){
arrayList.unshift(node.val);
node = node.next;
}
return arrayList;
}
4、输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
输入
[1,2,3,4,5,6,7],[3,2,4,1,6,5,7]
返回值
{1,2,5,3,4,6,7}
解
function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
}
function reConstructBinaryTree(pre, vin)
{
// write code here
//利用递归实现 其中preStart代表的是先序遍历的第一个节点的下标位置 后边的依次类推
function rebuild(preStart, preEnd, vinStart, vinEnd) {
let node = new TreeNode(pre[preStart])
//判断是否只有一个节点 如果只有一个节点 则返回节点本身
if ((preStart == preEnd) && (vinStart == vinEnd)) {
return node
}
let index = vin.indexOf(pre[preStart]) //查找树的根节点
let leftLen = index - vinStart //左子树的长度
let leftPrend = preStart + leftLen //先选出先序遍历的左子树的所有节点
if (leftLen > 0) {
//此时相当于遍历左子树的左子树 因此先序遍历开始的节点需加一 中序遍历结束的节点需减一
node.left = rebuild(preStart + 1, leftPrend, vinStart, index - 1)
}
if (leftLen < preEnd - preStart) {
node.right = rebuild(leftPrend + 1, preEnd, index + 1, vinEnd)
}
return node
}
let head = rebuild(0, pre.length - 1, 0, vin.length - 1)
return head
}
5、用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
解
let inStack = []
let outStack = []
function push(node)
{
inStack.push(node)
}
function pop()
{
// write code here
if(!outStack.length){
while(inStack.length){
outStack.push(inStack.pop())
}
}
return outStack.pop()
}
6、把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
输入
[3,4,5,1,2]
返回值
1
解
while(line=readline()){
let arr = JSON.parse(line);
print(minNumberInRotateArray(arr));
}
function minNumberInRotateArray(rotateArray) {
// write code here
if(rotateArray.length===0)return 0
let left = 0,right = rotateArray.length-1;
if(rotateArray[left]<rotateArray[right]){
return rotateArray[left];
}
let mid;
while(left<right){
if(left+1===right){
return rotateArray[right];
}
mid = (left+right)>>1;
if(rotateArray[left]<rotateArray[mid]){
left = mid;
}else if(rotateArray[left]>rotateArray[mid]){
right = mid;
}else{
if(rotateArray[right]===rotateArray[mid]){
return Math.min(...rotateArray.slice(left,right+1))
}
left = mid;
}
}
}
7、大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。
n≤39
解
function Fibonacci(n){
let f=0,g=1;
while(n--){
f=g+f;
g=f-g;
}
return f;
}
8、一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
输入
1
返回值
1
输入
4
返回值
5
解
function jumpFloor(number)
{
// write code here
if(number==1) return 1;
if(number==2) return 2;
var pre1=1,pre2=2,cur=0;
for(var i=3;i<=number;i++){
cur = pre1+pre2;
pre1 = pre2;
pre2 = cur;
}
return cur;
}
9、变态跳台阶:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
输入
3
返回值
4
解
function jumpFloorII(number)
{
if(number == 1) return 1
return jumpFloorII(number - 1) * 2
}
10、输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
解
function reOrderArray(array)
{
// write code here
var arr1 = [];
var arr2 = [];
array.forEach(function(item){
if(item % 2 === 0){
arr2.push(item);
}else{
arr1.push(item);
}
})
return arr1.concat(arr2)
}