双指针
一、数组篇
class Solution {
public int removeElement(int[] nums, int val) {
int slowIndex = 0;
//注意题目要求不使用额外数组空间!而是原地移除!
for(int fastIndex = 0;fastIndex<nums.length;fastIndex++){
if(nums[fastIndex]!=val){
nums[slowIndex] = nums[fastIndex];
slowIndex++;
}
}
return slowIndex;
}
}
二、字符串篇
class Solution {
public String reverseWords(String s) {
StringBuilder sb = removeSpace(s);
reverseString(sb,0,sb.length()-1);
reverseWord(sb);
return sb.toString();
}
//去掉空格(首尾+中间)
private StringBuilder removeSpace(String s){
int start = 0,end = s.length()-1;
while(s.charAt(start)==' '){
start++;
}
while(s.charAt(end)==' '){
end--;
}
StringBuilder sb = new StringBuilder();
while(start<=end){
//注意先后顺序,若交换顺序可能造成结尾出现多余空格的现象
if(s.charAt(start)!=' '||sb.charAt(sb.length()-1)!=' '){
sb.append(s.charAt(start));
}
start++;
}
return sb;
}
//整个字符串反转
private void reverseString(StringBuilder sb,int start,int end){
while(start<=end){
char tmp = sb.charAt(start);
sb.setCharAt(start,sb.charAt(end));
sb.setCharAt(end,tmp);
start++;
end--;
}
}
//单词反转
private void reverseWord(StringBuilder sb){
int start = 0,end = 1;
while(start<sb.length()){
while(end<sb.length() && sb.charAt(end)!=' '){
end++;
}
reverseString(sb,start,end-1);
start = end+1;
end = start+1;
}
}
}
三、链表篇
四、N数之和篇