JS解力扣每日一题(七)——821. 字符的最短距离(2022-4-19)

题目

给你一个字符串 s 和一个字符 c ,且 c 是 s 中出现过的字符。
返回一个整数数组 answer ,其中 answer.length == s.length 且 answer[i] 是 s 中从下标 i 到离它 最近 的字符 c 的 距离 。
两个下标 i 和 j 之间的 距离 为 abs(i - j) ,其中 abs 是绝对值函数。

示例1

输入:s = "loveleetcode", c = "e"
输出:[3,2,1,0,1,0,0,1,2,2,1,0]
解释:字符 'e' 出现在下标 35611 处(下标从 0 开始计数)。
距下标 0 最近的 'e' 出现在下标 3 ,所以距离为 abs(0 - 3) = 3 。
距下标 1 最近的 'e' 出现在下标 3 ,所以距离为 abs(1 - 3) = 2 。
对于下标 4 ,出现在下标 3 和下标 5 处的 'e' 都离它最近,但距离是一样的 abs(4 - 3) == abs(4 - 5) = 1 。
距下标 8 最近的 'e' 出现在下标 6 ,所以距离为 abs(8 - 6) = 2

示例2

输入:s = "aaab", c = "b"
输出:[3,2,1,0]

我的答案

/**
 * @param {string} s
 * @param {character} c
 * @return {number[]}
 */
var shortestToChar = function(s, c) {
    let arr = s.split('')
    let nums = []
    // 找出重复字符的下标
    for (i in arr) {
        if (arr[i] === c) {
            nums.push(i)
        }
    }
    //遍历整个字符串数组
    let answer = []
    for (j in arr) {
        let all = []
        //遍历重复字符的下标 
        for (k in nums) {
            all.push(Math.abs(j - nums[k]))
        }
        answer.push(Math.min.apply(null, all))
    }
   return answer
};

补充知识点 apply()函数

  • 咱这里是巧用了apply() 函数

  • 因为Math.min参数里面不支持Math.max([param1,param2]) 也就是数组
    但是它支持Math.max(param1,param2,param3…),

  • 所以可以根据apply的特点来解决 let min=Math.min.apply(null,array),这样轻易的可以得到一个数组中最小的一项
    (apply会将一个数组装换为一个参数接一个参数的传递给方法)

  • 这块在调用的时候第一个参数给了一个null,这个是因为没有对象去调用这个方法,我只需要用这个方法帮我运算,得到返回的结果就行,.所以直接传递了一个null过去

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值