学习目标:
- [ ]学习字符串的相关操作
学习内容:
例如:
- 字符串的相关函数
- 双指针法应用与字符串
学习时间:
- 2025-05-21周三晚上
学习产出:
- 18. 四数之和
解题思路
本题和三数之和类似,想到了再引入一个指针的算法,但是对于重复值和去枝考虑不清楚,导致花了大量时间没做出来,看了讲解之后异常清晰,本题基本不算自己做出来,还需要笑话
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> lists = new ArrayList<>();
int len = nums.length;
Arrays.sort(nums);
for(int i = 0 ; i < len ;i++) {
if(nums[i] > target && nums[i] > 0) {
break;
}
if(i > 0 && nums[i] == nums[i-1]) {
continue;
}
for (int k = i +1;k<len;k++){
int left = k+1;
int right = len -1;
if(nums[i] + nums[k] > target && nums [k] > 0) {
break;
}
if (k > i+1 && nums[k] == nums[k-1]) {
continue;
}
while(left <right){
long sum = (long)nums[i]+nums[k]+nums[left]+nums[right];
if(sum < target) {
left++;
}else if (sum > target) {
right--;
}else {
lists.add(Arrays.asList(nums[i],nums[k],nums[left],nums[right]));
while (nums[right] == nums[right-1] && right >left){
right--;
}
while (nums[left] == nums[left+1] && right >left){
left++;
}
right--;
left++;
}
}
}
}
return lists;
}
}
- 344.反转字符串
解题思路
运用双指针秒了
class Solution {
public void reverseString(char[] s) {
int len = s.length;
int left = 0;
int right = len-1;
while(left <= right) {
char temp =s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
}
- 541. 反转字符串II
解题思路
本题需要考虑最后一部分单独的处理,前面以2k(len/2(2*k))遍历即可,做复杂了但还是做出来了,题解代码更简洁
class Solution {
public String reverseStr(String s, int k) {
char[] c = s.toCharArray();
// 有多少个2K
int len = s.length();
int nums = len / (2*k);
int oth = len % (2*k);
for(int i = 0;i<nums;i++) {
int left = i*2*k;
int right = left+k-1;
while(left <= right) {
char temp =c[left];
c[left] = c[right];
c[right] = temp;
left++;
right--;
}
}
int left = nums*2*k;
if(oth >= k){
int right = left+k-1;
while(left <= right) {
char temp =c[left];
c[left] = c[right];
c[right] = temp;
left++;
right--;
}}else {
int right = len-1;
while(left <= right) {
char temp =c[left];
c[left] = c[right];
c[right] = temp;
left++;
right--;
}
}
return new String(c);
}
}