yubのAlgorithm.0xb
反转字符串
link:344. 反转字符串 - 力扣(LeetCode)
思路分析
其实最开始学C语言的时候,也遇到过类似题目.当时自以为的投机取巧无非只是倒序打印而不是逆置元素.(hh 果然小白都会这样 当然也有更聪明的小懒狗直接用库函数 【及其不推荐】
双指针
1 | class Solution { |
Tip
更优雅的处理方式——异或
因为a ^ a = 0,b ^ 0 =b
所以:
1 | class Solution { |
第一步: s[left] ^= s[right];
- 用
s[left]
与s[right]
进行异或操作,并将结果存储在s[left]
中。 - 此时
s[left]
的值变为A ^ B
,而s[right]
仍然是B
。
第二步: s[right] ^= s[left];
- 将
s[right]
与更新后的s[left]
进行异或操作,并将结果存储在s[right]
中。 - 因为
s[left]
是A ^ B
,所以s[right] ^= (A ^ B)
相当于B ^ (A ^ B)
。 - 由于
B ^ B = 0
和0 ^ A = A
,此时s[right]
的值变为A
。
第三步: s[left] ^= s[right];
- 将
s[left]
与更新后的s[right]
进行异或操作,并将结果存储在s[left]
中。 - 因为
s[right]
是A
,所以s[left] ^= A
相当于(A ^ B) ^ A
。 - 由于
A ^ A = 0
和0 ^ B = B
,此时s[left]
的值变为B
。
四数之和
思路分析
本题大致思路和三数之和基本一致,只不过题目给出四个数字都互不相同且target是输入的并非0.
在三数之和的基础单独嵌套for循环即可.
**注意 **
当数组首元素大于0并且i下标位置的value大于target的时候就可以直接pass.
因为当target为负数但首元素比target大时就可能会忽略值.
例:target = -6 但nums[0] = -5
如果按照三数之和的去重条件会不符合预期【因为三数之和求解的target是0 元素都大于0 那三数加和自然不会为0】
1 | if(nums[i] > 0) |
去重a的逻辑相同 为了避免[1,1,2]这种情况 判断为
1 | if(i > 0 && nums[i] == nums[i -1]) |
去重b的逻辑从i+1位置开始【其实相当于left】 和去重a一样的逻辑
1 | if(j > i + 1 && nums[j - 1] == nums[j]) |
双指针
1 | class Solution { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 幻境!
评论