算法训练营(第一期)第五天(java)
学习感悟:
题目
一、四数之和(leetCode18)
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
//模仿三数之和,对于去重的话
Arrays.sort(nums);
List<List<Integer>> L=new ArrayList();
for(int i=0;i<nums.length;i++){
//因为target可能为负数,nums[i]也可能为负数
if(nums[i]>target&&nums[i]>0) {return L;}
if(i>0&&nums[i]==nums[i-1]) continue;
for(int j=i+1;j<nums.length;j++){
if(j>i+1&&nums[j]==nums[j-1]) continue;
//如果j从0开始的话出现1,2,x,x与2,1,x,x就重复了
int right=nums.length-1;
int left=j+1;
while(right>left){
int sum=nums[i]+nums[j]+nums[right]+nums[left];
if(sum>target){
right--;
}
else if(sum<target){
left++;
}
else{
//先移动再存入的话可能会导致最后存入的不是要存入的
L.add( Arrays.asList(nums[i],nums[j],nums[left],nums[right]));
while(right>left&&nums[left]==nums[left+1]){
left++;
}
while(right>left&&nums[right]==nums[right-1]){
right--;
}
left++;
right--;
}
}
}
}
return L;
}
}
二、翻转字符串(leetcode344)
class Solution {
public void reverseString(char[] s) {
for(int i=0;i<(s.length/2);i++){
char temp=s[i];
s[i]=s[s.length-i-1];
s[s.length-i-1]=temp;
}
}
}
三、翻转字符串2(leetcode541)
题目
错误解法:我的解法错误但我看不出来错在哪里了…
class Solution {
public String reverseStr(String s, int k) {
int i=0;
int count=0;
char[] c=s.toCharArray();
//这个保证了前2k都被处理了
for(;i<c.length;i+=2*k){
fanZhuan(c,i,i+k-1);
}
//接下来的不用while了只需要使用if
i=i-2*k;
if(c.length-i>=k){
fanZhuan(c,i,i+k-1);
}else{
fanZhuan(c,i,c.length-1);
}
return new String(c);
}
void fanZhuan(char[] nums,int left,int right){
while(left<right){
char temp= nums[left];
nums[left]=nums[right];
nums[right]=temp;
left++;
right--;
}
}
}
正确解法:
class Solution {
public String reverseStr(String s, int k) {
char[] c=s.toCharArray();
//这个保证了前2k都被处理了,而且后面的包含k的也被处理了
for(int i=0;i<c.length;i+=2*k){
if(i+k<=c.length){
fanZhuan(c,i,i+k-1);
continue;
}
fanZhuan(c,i,c.length-1);
}
//接下来的不用while了只需要使用if
return new String(c);
}
void fanZhuan(char[] nums,int left,int right){
while(left<right){
char temp= nums[left];
nums[left]=nums[right];
nums[right]=temp;
left++;
right--;
}
}
}