第三关数组(白银)
1 双指针思想
2 删除元素专题
2.1 原地移除所有数值等于val的元素
public static int removeElement(int[] nums,int val){
int slow=0;
//fast充当了快指针的角色
for (int fast = 0; fast < nums.length; fast++) {
if (nums[fast]!=val){
nums[slow]=nums[fast];
slow++;
}
}
//最后剩余元素的数量
return slow;
}
public int removeElementTwo(int[] nums,int val){
int right=nums.length-1;
int left=0;
while (left<=right){
if ((nums[left]==val)&&(nums[right]!=val)){
int tmp=nums[left];
nums[left]=nums[right];
nums[right]=tmp;
}
if (nums[left]!=val){
left++;
}
if (nums[right]==val){
right--;
}
return left;
}
return left;
}
public int removeElementThree(int[] nums,int val){
int right=nums.length-1;
for (int left = 0; left <=right;) {
if (nums[left]==val){
nums[left]=nums[right];
right--;
}else {
left--;
}
}
return right+1;
}
2.2 删除有序数组中的重复项
public static int removeDuplicates(int[] nums) {
//slow表示可以放入新元素的位置,索引为0的元素不用管
int slow = 0;
//循环起到了快指针的作用
for (int fast = 0; fast < nums.length; fast++) {
if (nums[fast] != nums[slow]) {
slow++;
nums[slow] = nums[fast];
}
}
return slow+1;
}
3 元素奇偶移动专题
public static int[] sortArrayByParity(int[] A) {
int left =0,right=A.length-1;
while(left<right) {
if (A[left]%2>A[right]%2){
int tmp=A[left];
A[left]=A[right];
A[right]=tmp;
}
if (A[left]%2==0)left++;
if (A[right]%2==1)right--;
}
return A;
}
4 数组轮转问题
public static void rotate(int[] nums, int k) {
k %= nums.length;
reverse(nums, 0, nums.length - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, nums.length - 1);
}
public static void reverse(int[] nums, int start, int end) {
while (start < end) {
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start += 1;
end -= 1;
}
}
5 数组的区间专题
6 字符串替换空格问题
/**
* 方法1:创建新的字符串
*
* @param str
* @return
*/
public static String replaceSpace(StringBuffer str) {
String res = "";
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (c == ' ')
res += "%20";
else
res += c;
}
return res;
}
/**
* 方法2:在原数组基础上改
*
* @param str
* @return
*/
public static String replaceSpace2(StringBuffer str) {
if (str == null)
return null;
int numOfblank = 0;//空格数量
int len = str.length();
for (int i = 0; i < len; i++) { //计算空格数量
if (str.charAt(i) == ' ')
numOfblank++;
}
str.setLength(len + 2 * numOfblank); //设置长度
int fast = len - 1; //两个指针
int slow = (len + 2 * numOfblank) - 1;
while (fast >= 0 && slow > fast) {
char c = str.charAt(fast);
if (c == ' ') {
fast--;
str.setCharAt(slow--, '0');
str.setCharAt(slow--, '2');
str.setCharAt(slow--, '%');
} else {
str.setCharAt(slow, c);
fast--;
slow--;
}
}
return str.toString();
}