JS练习日记 剑指offer3-7

剑指 Offer 03. 数组中重复的数字

找出数组中重复的数字。
在一个长度为 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]);
        }
    }
};

剑指 Offer 04. 二维数组中的查找

在一个 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;
};

剑指 Offer 05. 替换空格

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

/**
 * @param {string} s
 * @return {string}
 */
var replaceSpace = function(s) {
    return s.replace(/ /g,"%20");

};

剑指 Offer 06. 从尾到头打印链表

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

/**
 * 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();

};

剑指 Offer 07. 重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。

假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

/**
 * 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);

};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值