一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情。
一、题目描述
- 给你一个字符串
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' 出现在下标 3、5、6 和 11 处(下标从 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]
- 提示:
1 <= s.length <= 10000s[i]和c均为小写英文字母- 题目数据保证
c在s中至少出现一次
二、思路分析:
- 对于字符串只存在一个字符
c的时候- 只需要遍历这个字符串,将每个下标减去字符
c在字符串当中的下标,然后再去绝对值,就能够得到答案,参考示例2
- 只需要遍历这个字符串,将每个下标减去字符
- 对于字符串存在很多个字符
c,如示例1- 首先遍历字符串,找到字符
c在字符串中的所有位置下标 - 然后遍历整个字符串,将字符串的每一个下标与字符
c的每一个位置下标相减取绝对值 - 然后利用
Math.min方法得到最小的差值,添加进定义好的数组变量保存 - 遍历完返回保存结果的数组变量
- 首先遍历字符串,找到字符
三、AC 代码:
function shortestToChar(s: string, c: string): number[] {
let result = [];
let cIndex = [];
for(let i = 0; i < s.length; i++){
if(s[i] === c){
cIndex.push(i)
}
}
for(let i = 0; i < s.length; i++){
let minIndex = s.length - 1;
for(let j = 0; j < cIndex.length; j++){
minIndex = Math.min(minIndex, Math.abs(cIndex[j] - i));
}
result.push(minIndex);
}
return result;
};
四、总结:
- 数字取绝对值方法
Math.abs(num),多个数字求最小值方法Math.min(num1, num2...) - 定义
minIndex初始值时,因为求得是最小值,所以初始值不能为0,如果初始值为0,那么结果永远是0。所以这里定义的初始值为s.length - 1,因为差值最大的就是s.length - 1 - 题目简单难度,更多解题方式,移步题解区