我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第13篇文章 点击查看文章详情 🚀🚀
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情🚀🚀
前言
今天到了小结一个礼拜成果的时候了。
温故而知新~
⭐⭐⭐
459. 重复的子字符串 - 力扣(LeetCode)
api解法
var repeatedSubstringPattern = function(s) {
let len = s.length;
let step = 1;
let nums = s.substr(0,step);
while( step <= len/2){
if(nums.repeat(len/step) == s){
return true;
}
else{
step++;
nums = s.substr(0,step);
}
}
return false
};
思路
利用滑动窗口的思想,如果该窗口中的字符串正好是s字符串的重复子串,那么重复len/step次后,正好会等于s字符串。
详细步骤
开始设置窗口的宽度为step,初始值为1,将该窗口重复len/step次,如果不满足重复后等于s字符串,则将step++,同时更新子字符串nums = s.substr(0.step),不断循环,直到达到边界条件,如果还不满足,则直接返回false。
注意:
窗口有一个边界的条件,那就是窗口的最大宽度不会超过字符串的一半。因为字符串是由子字符串组成,重复的次数至少为2。while(step <= len/2)
字符串总结
反转字符串
- api解法
// 定义被反转的字符串
const str = 'juejin'
// 定义反转后的字符串
const res = str.split('').reverse().join('')
console.log(res) // nijeuj
- 双指针解法
while(l < r){
[s[l],s[r]] = [s[r],s[l]];
l++;
r--;
}
判断回文
- 直接反转
function isPalindrome(str) {
// 先反转字符串
const reversedStr = str.split('').reverse().join('')
// 判断反转前后是否相等
return reversedStr === str
}
- 双指针
利用回文的对称属性
function isPalindrome(str) {
// 缓存字符串的长度
const len = str.length
// 遍历前半部分,判断和后半部分是否对称
for(let i=0;i<len/2;i++) {
if(str[i]!==str[len-i-1]){
return false
}
}
return true
}
掌握好api
替换空格
api:
let res = s.split(' ');
let newS = res.join('%20');
return newS
正则
return s.replace(/ /g, "%20");
重复的子字符串
完整的过程
var repeatedSubstringPattern = function(s) {
let len = s.length;
let step = 1;
let nums = s.substr(0,step);
while( step <= len/2){
if(nums.repeat(len/step) == s){
return true;
}
else{
step++;
nums = s.substr(0,step);
}
}
return false
};
s.substr(0,step)截取下标位置为[0,step]的字符串nums.repeat(len/step)重复len/step次
双指针总结
数组中
数组移除元素
在数组移除元素的题型中:27. 移除元素 - 力扣(LeetCode)
👉👉👉 动态效果图
要移除数组上的元素,不能做到真正的删除,只能进行覆盖。
let slow = 0;
let len = nums.length;
for(let fast = 0;fast < len ;fast++){
if(nums[fast] != val){
nums[slow] = nums[fast];
slow++;
}
}
return slow;
创建快慢指针,快指针先移动,若快指针对应的值不是目标值,就把该值赋值给慢指针。
字符串中
反转字符串
while(l < r){
[s[l],s[r]] = [s[r],s[l]];
l++;
r--;
}
双指针,一个指头,一个指尾,每一次让首尾元素进行互换,再让指针向内移动。
链表中
反转链表
首先要定义
cur指向当前头结点,再定义pre指向cur的上一个结点。
var reverseList = function(head) {
if(!head) return head;
let cur = head;
let pre = null;
while(cur){
let next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
};
要实现反转的效果,只需要每次cur.next = pre
删除链表倒数第n个结点
这里用到了fast和slow快慢指针
如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。
N数之和中
三数之和
还是那句话,求和问题,一般情况下都可以转换成差值问题
像上面这样,固定一个数,然后用双指针移动两个数。
在实现之前不要忘了要对原数组进行排序。
小结
以上就是对这个礼拜刷过的题的一个小结,肯定还有不少是我自己没注意到的,没事,反正以后还会进行二刷,三刷。
😁😁😁