半夜发表
二维数组中的查找
题目
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
题解
从右上角开始查找,如果等于要找的数则查找成功;如果大于要查找的数则要找的数在当前列的左边;如果小于要查找的数则要查找的数在当前行的下边。数组为空以及查完整个数组还没有找到时要查找的数不存在
算法逻辑较简单,就不贴代码了
替换空格
题目
题解
利用js函数很容易解决,用split(" “)将字符串以空格分隔分割成数组,再用join(”%20")将数组以%20分隔连接成字符串
还可以直接用replace(/ /g, “%20”)
从尾到头打印链表
题目
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)
题解
由题意,最先遍历的最后打印,最后遍历的最先打印,很容易想到先进后出,即我们可以利用栈,从头遍历链表并把值压入栈中,遍历完后打印栈中数据
也可以利用递归来做
这里题目希望返回数组,我们可以利用js中数组对象的unshift()方法从头部插入数据,实现代码如下
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {number[]}
*/
var reversePrint = function(head) {
if(!head) return [];
var res = [];
let p = head;
while(p){
res.unshift(p.val);
p = p.next;
}
return res;
};
重建二叉树
题目
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字
题解
数组中数字出现的次数
题目
在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字
题解
利用数组的indexOf()函数和lastIndexOf()函数,当两个函数的返回结果相等时,该数只出现了一次
还有一种做法,利用哈希表,当前数第一次出现时存入哈希表,次数记1,下次出现时次数加1,当第三次出现时,删除哈希表里的这个数,最后哈希表里剩下的就是只出现一次的数
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
let map = {};
for(let i = 0; i < nums.length; i++){
if(!map[nums[i]]) map[nums[i]] = 1; //不存在时存入
else if(map[nums[i]] === 1) map[nums[i]] = 2; //已存在,出现次数加一
else if(map[nums[i]] === 2) delete map[nums[i]]; //已出现三次则移除
}
for(let i in map){
return i; //剩下的就是只出现一次的数
}
};