力扣(LeetCode)题解(使用JavaScript)【4】

(1)打印从1到最大的n位数

输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。

示例 1:
输入: n = 1
输出: [1,2,3,4,5,6,7,8,9]
说明:
用返回一个整数列表来代替打印
n 为正整数

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

/**
 * @param {number} n
 * @return {number[]}
 */
var printNumbers = function(n) {
    
    
var number = 1;
for(i=0;i<n;i++)
{
    
    
    number=10*number;
}
var b = [];
for(i=1;i<number;i++)
{
    
     
b.push(i);
}
return b;
};

题解:
计算出最后一位数应该是10^n-1,
然后再从1-10^n-1依次进行输出。

(2) 返回倒数第 k 个节点

实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
注意:本题相对原题稍作改动

示例:
输入: 1->2->3->4->5 和 k = 2
输出: 4
说明:
给定的 k 保证是有效的。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-node-from-end-of-list-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} k
 * @return {number}
 */
var kthToLast = function(head, k) {
    
    
    var heada = head;
    var len=0;
    for(i=0;head!=null;i++){
    
    
        head = head.next;
        len++;
    }
    // return len; //计算出这个链表的长度
    for(j=0;j<len-k;j++)
    {
    
    
        heada = heada.next;
    }
    return heada.val;
};

题解:
实际上我用的还是顺序的方式,因为先计算了单向链表的长度,后来再从首元素开始遍历列表到倒数第k个元素。

别人的方法:

最容易想到的就是双指针方法,右指针先走k步,然后左右指针一起走,直到右指针遇到链表尾,就返回左指针。
var kthToLast = function(head, k) {
// 双指针
var left = head, right = head;
while(k > 0) {
right = right.next;
k–;
}
while(right !== null) {
left = left.next;
right = right.next;
}
return left.val
};

作者:coconilu
链接:https://leetcode-cn.com/problems/kth-node-from-end-of-list-lcci/solution/shuang-zhi-zhen-he-di-gui-js-by-coconilu/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

(3) 统计有序矩阵中的负数(*)

给你一个 m * n 的矩阵 grid,矩阵中的元素无论是按行还是按列,都以非递增顺序排列。

请你统计并返回 grid 中 负数 的数目。

示例 1:

输入:grid = [[4,3,2,-1],[3,2,1,-1],[1,1,-1,-2],[-1,-1,-2,-3]]
输出:8
解释:矩阵中共有 8 个负数。
示例 2:

输入:grid = [[3,2],[1,0]]
输出:0
示例 3:

输入:grid = [[1,-1],[-1,-1]]
输出:3
示例 4:

输入:grid = [[-1]]
输出:1

提示:

m == grid.length
n == grid[i].length
1 <= m, n <= 100
-100 <= grid[i][j] <= 100

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-negative-numbers-in-a-sorted-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

/**
 * @param {number[][]} grid
 * @return {number}
 */
var countNegatives = function(grid) {
    
    
    var n = 0;
    for(i=0;i<grid.length;i++)
    {
    
    
        for(j=0;j<grid[0].length;j++)
        {
    
    
            if(grid[i][j]<0)
            {
    
    n++;}
        }
    }
    return n;
//我的方法还是需要再优化的
//直观思路:只要在每一行遇到了负数,那么从他往后都是负数
};

别人的简单解法(代码少)

(4)替换空格(用正则表达式)

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

示例 1:

输入:s = “We are happy.”
输出:“We%20are%20happy.”

限制:

0 <= s 的长度 <= 10000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

/**
 * @param {string} s
 * @return {string}
 */
var replaceSpace = function(s) {
    
    
//使用正则表达式
s1= s.replace(/ /g,'%20');
return s1;
};

(5) 将每个元素替换为右侧最大元素

给你一个数组 arr ,请你将每个元素用它右边最大的元素替换,如果是最后一个元素,用 -1 替换。

完成所有替换操作后,请你返回这个数组。

示例:

输入:arr = [17,18,5,4,6,1]
输出:[18,6,6,6,1,-1]

提示:

1 <= arr.length <= 10^4
1 <= arr[i] <= 10^5

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/replace-elements-with-greatest-element-on-right-side
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

/**
 * @param {number[]} arr
 * @return {number[]}
 */
var replaceElements = function(arr) {
    
    
    var b = [];
    for(var i=0;i<arr.length-1;i++)
    {
    
    
        var max = arr[i+1];
        for(n=0;n<arr.length-i;n++){
    
    
        if(arr[i+1+n]>max)
        {
    
    
            max = arr[i+1+n];
        }
        }
        b.push(max);
       
    }
    b.push(-1);
    return b;
};

注解
我的这个方法是个超级笨方法,执行起来总的还是麻烦费时间,所以在这里着重看一下其他大神的题解。
别人的题解

后记:
今天的博客写的好敷衍,太晚了脑子开始罢工,不想思考,后边有机会的话再仔细进行题解的认真分析,不过每天都定下一点目标总是好的,不至于无所事事。

猜你喜欢

转载自blog.csdn.net/weixin_34727238/article/details/106085453