剑指思路3~6


半夜发表

二维数组中的查找

题目

在一个 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;   //剩下的就是只出现一次的数
    }
};

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值