前言
🌟🌟本期讲解关于力扣算法两道双指针题目解析~~~
🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客
🔥 你的点赞就是小编不断更新的最大动力
🎆那么废话不多说直接开整吧~~
目录
📚️1.移动零
1.1题目要求
1.2题目解析
1.3代码编译
📚️2.快乐数
2.1题目要求
2.2题目解析
1.规定容器进行判断(简单)
2.双指针的算法(困难)
2.3代码编译
📚️3.总结
📚️1.移动零
1.1题目要求
移动零的题目位置,在这里:283. 移动零 - 力扣(LeetCode)
本题目如下:
给定一个数组
nums
,编写一个函数将所有0
移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。
也就就表达:给一个数组,将所有的0移动到数组的后面,然后前面的数字的顺是不变的:
一个数组:[0 ,1 ,0 ,3 ,2]:经过改变后编变成了:[1 ,3 ,2 ,0 ,0]
如下图:
1.2题目解析
本题目像这种一般都是使用的双指针的算法,一般就是设置三个区间,左边就是处理过没有0的区间,中间全部都是零,然后右边就是没有处理的数字
注意:这里的指针不是学习c语言中的指针,这里的指针就是用数组的下标进行模拟,这里指针就是下标;
此时我们的思路就是:
起初:cur=0,dest=0
然后:cur往后面移动,如果遇到零就不管,若遇到非0的数,那么就和dest所示的数字进行交换,然后两个加加;
最后:判断两个cur是否已经到达了末尾的位置,这个就是一个循环跳出的条件
1.3代码编译
如下所示:
class Solution {public void moveZeroes(int[] nums) {int cur=0,dest=0;for(;cur<nums.length;cur++){if(nums[cur]!=0){int temp=nums[cur];nums[cur]=nums[dest];nums[dest]=temp;dest++;}}}
}
注意:这里由于每次cur都会加加,所以在循环里就不用操作cur了,然后期间,还添加了一个交换的操作,在我们学习语言的初期,就已经了解这个交换的过程,小编就不在进行过多的赘述了;
📚️2.快乐数
一个小玩笑就是,这里的快乐数其实挂着简单的标签,实则这里的操作一点也不简单,还一点也不快乐,看看大家的反应吧:
哈哈哈哈,所以这道题其实一点也不快乐;
2.1题目要求
力扣的题目的来源:202. 快乐数 - 力扣(LeetCode)
题目如下所示:
「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果
n
是 快乐数 就返回true
;不是,则返回false
总结就是:每次数字进行每一位的平方相加,然后看看是否为一,不是一就继续进行每一位的平法相加的操作;如下所示:
19 ----82-----68-----100----1
此时这个就是一个快乐数字~~~
2.2题目解析
1.规定容器进行判断(简单)
这里就是通过一个容器存储每次得到的数字,然后拿到一个数字后,与容器中的数字进行比较,看看是否存在,若存在就返回失败,反之若得到1,那么就返回true;
为啥如果存在就直接返回false呢??
如下图所示:
可以看到,此时若存在一样的值,就表示进入了一个循环的状态,那么此时就不可能拿到1了;
所以某一刻拿到了1,此时就可以跳出循环了,若存在两个相等的数,就可以直接返回false了,因为后面就不会拿到1了~~~
2.双指针的算法(困难)
此时我们可以使用一个快慢的指针的模拟的操作,因为这里没有数组的下标的样式,所以这里我们就能够用实际的数字进行表示
快指针:一次移动两步
慢指针:一次移动一步
重点: 此时这两个指针一定是会存在相遇的情况,因为当为1的时候,就会进行全部是1的循环,那么我们就只需要判断,相遇的点是否是1,若是一就表示是快乐数,若相遇的数字不是1,那么此时就表示,进入了如上图所示的循环;
如下图所示:
若是一个快乐的数字,那么情况就是如下所示的:
2.3代码编译
第一种算法的情况:
class Solution {public boolean isHappy(int n) {List<Integer> list = new ArrayList<>(10);while (n != 1) {n = Sum(n);if (list.contains(n)) {return false;}list.add(n);}return true;}public int Sum(int num) {int sum = 0;while (num > 0) {int n = num % 10;num /= 10;sum += n * n;}return sum;}}
注意:这里就需要定义一个方法进行数字平法相加的算法,这里的循环条件就是是否为一,或者进入循环了,直接跳出;
第二种算法的代码:
class Solution {public boolean isHappy(int n) {int slow = n;int fast = Sum(n);while (slow != fast) {slow = Sum(slow);fast = Sum(fast);fast = Sum(fast);}if (slow == 1) {return true;} else {return false;}}public int Sum(int num) {int sum = 0;while (num > 0) {int n = num % 10;num /= 10;sum += n * n;}return sum;}}
注意:我们进入循环的条件是两者不等,所以这里我们这里初始化两个指针的时候不能相等,这里fast要进行两次平方相加的过程,slow只需要进行一次平方相加的过程;
📚️3.总结
对于双指针,本期主要讲解了一个移动零,与快乐数的操作,小编建议大家进行联系,在看了小编的题目分析后能够自己编写代码~~
🌅🌅🌅~~~~最后希望与诸君共勉,共同进步!!!
💪💪💪以上就是本期内容了, 感兴趣的话,就关注小编吧。
😊😊 期待你的关注~~~