持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情
编程世界总是离不了算法
最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力
于是决定蹭着假期,加强算法和数据结构相关的知识
那怎么提升呢?
其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode
刷题之旅
第一阶段目标是:200
道,每天1
到2
篇
为了不乱,本系列文章目录分为三部分:
- 今日题目:xxx
- 我的思路
- 代码实现
今日题目:942. 增减字符串匹配
由范围 [0,n] 内所有整数组成的 n + 1 个整数的排列序列可以表示为长度为 n 的字符串 s ,其中:
如果 perm[i] < perm[i + 1] ,那么 s[i] == 'I' 如果 perm[i] > perm[i + 1] ,那么 s[i] == 'D' 给定一个字符串 s ,重构排列 perm 并返回它。如果有多个有效排列perm,则返回其中 任何一个 。
示例 1:
输入:s = "IDID" 输出:[0,4,1,3,2]
示例 2:
输入:s = "III" 输出:[0,1,2,3] 示例 3:
输入:s = "DDI" 输出:[3,2,0,1]
提示:
1 <= s.length <= 105 s 只包含字符 "I" 或 "D"
我的思路
首先看一下题意,简洁的描述,提供一个字符串,里边只有 I 和 D 两种字符,要求输出一个数组,长度是字符串的长度 + 1,内容是从 0 - 字符串的长度的所有数字, 顺序是根据字符串顺序 I D 两种字符,下一个比上一个大或小
然后观察一下示例提供的规律,先把提供的所有数字列出来,对比结果,会发现
如果当前字符是 I,数组中的值为当前结果集中最小的值
如果当前字符是 D,数组中的值为当前结果集中最大的值
最后一位是剩下的一个数字
由上发现的规律,采用双指针方法尝试
定义双指针min, max 存储当前最大值最小值
定义结果数组 arr
把 s 结尾拼一个,让字符串与结果相对,实际拼I 或者 D 都可以,因为通过这种方法最终 min 和 max只会差 1,不管是min + 1 还是 max - 1都是一样的
然后循环s ,根据其中的每一项,往结果数组中 Push max 或者 min 就可以了,相应的把 max-- 或者 min ++
代码实现
/**
* @param {string} s
* @return {number[]}
*/
var diStringMatch = function (s) {
let arr = [];
let min = 0;
let max = s.length
s += s[s.length - 1]
for (let i = 0; i < s.length; i++) {
if (s[i] === 'I') {
arr.push(min)
min++
} else {
arr.push(max)
max--
}
}
return arr
};
总结
实现方式其实有很多,这里仅供参考~
由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹