找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
/**
* @param {number[]} nums
* @return {number}
*/
var findRepeatNumber = function(nums) {
var s1=new Set();
for (var i=0;i<nums.length;i++){
if(s1.has(nums[i])){
return nums[i];
}else{
s1.add(nums[i]);
}
}
};
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
/**
* @param {number[][]} matrix
* @param {number} target
* @return {boolean}
*/
var findNumberIn2DArray = function(matrix, target) {
const m = matrix.length;
const n = matrix[0]?matrix[0].length:0;
if(!(m&&n)) return false;
// 官方解法: 螃蟹走法
// 坐标 x,y
let x = 0;
let y = m-1; // 这是左下角坐标
while(x<n&&y>-1) {
if(matrix[y][x]==target) return true;
else if(matrix[y][x]>target) y--
else x++;
}
return false;
};
请实现一个函数,把字符串 s
中的每个空格替换成"%20"。
/**
* @param {string} s
* @return {string}
*/
var replaceSpace = function(s) {
return s.replace(/ /g,"%20");
};
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {number[]}
*/
var reversePrint = function(head) {
var tmp=new Array();
while(head!=undefined){
tmp.push(head.val);
head=head.next;
}
return tmp.reverse();
};
输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {number[]} preorder
* @param {number[]} inorder
* @return {TreeNode}
*/
var buildTree = function(preorder, inorder) {
var process = (root, left, right) => {
if (left > right) return null
let node = new TreeNode(preorder[root]); // 获取根结点
let i = inorder.indexOf(preorder[root]); // 根结点在中序排序中index
node.left = process(root + 1, left, i - 1); // 迭代左子树
node.right = process(root + (i - left) + 1, i + 1, right) // 迭代右子树 (i - left) 左子树长度
return node;
}
return process(0, 0, inorder.length - 1);
};