27.移除元素
双指针思路:b找到的不是val值,a找到的是val值,每次把b的值赋给a,当a>=b 跳出循环,
1)当b没找到非val时,b–==-1,return 0;
2)当a没找到val值时,return b+1即为原来数组条件
3)当为[] b=-1 return 0;
4) 当为[1] 1 b–=-1,return 0;
public int removeElement(int[] nums, int val) {
int a=0 ; //
int b=nums.length-1; //尾指针
while(a<b){
while(b>0 && nums[b]==val) b--; //[3,3,3] 3 如没有b>0,会导致溢出
while(a< nums.length && nums[a]!=val) a++;
//每次循环 a=val b!=val
if(a>=b) break;
nums[a]=nums[b];
a++;
b--;
}
if(b>=0 && nums[b]==val) b--; //[1] 1 b=-1 return 0;[]
return b+1; //[2,2] 3 a=2,a>b ,break;return b+1=2;
}
38.外观函数
题解:运用递归函数对上一个字符串进行解释。例如 n=4 读3=“21” 没有出现相同元素则读出 1个2 1个1 == 1211
具体思路:运用双指针检测相同元素,并把个数和当前元素加入到字符数组中。
public String countAndSay(int n) {
if(n==1) return "1";
else{
String faye = countAndSay(n-1); //只需每次读出上个元素即可
StringBuilder leslie = new StringBuilder(); //StringBuilder动态字符数组
int a= 0 ;
int b= 0 ;
while(b<faye.length()) { // b没进行到文件末尾
if(faye.charAt(a)!=faye.charAt(b)){
leslie.append(b-a).append(faye.charAt(a));
a=b;
}
b++; //进行到末尾 ,相应的尾指针+1
}
leslie.append(b-a).append(faye.charAt(a));
return leslie.toString();
}
}