7.有序数组去重。给定一个排好序的数组,要求删掉重复出现的元素,并且不能使用额外的存储空间。最后返回新的数组。
例如,array={1,2,3,3,3,5,7},输出新数组{1,2,3,5,7}
solution:
算法中使用两个指针left和right,分别用于标识元素的下标。left由0开始向下标增大的方向移动,而right初始位置由index
为1的位置同样向着下标增大的方向移动。right逐步遍历数组中的每个元素,
当array[left]!=array[right],将right所指向的元素赋值给left所指向的元素的下一个元素,并且left指向一个元素。
当array[left]==array[right],right指向下一个元素。left则是原地不动。具体实现的代码如下:
import java.util.ArrayList;
public class question7 {
ArrayList<Integer> removeDuplicates(ArrayList<Integer> arraylist) {
//由于该方法需要改变数组的长度,而一般的数组length标识为final,所以本题使用ArrayList
//如果只是return新数组的长度则可以使用一般的数组
if ((arraylist.isEmpty())|| arraylist.size()==1) {
return arraylist;
} else {
int left=0,right=1;//left记录新数组的最后一个位置,right实现遍历数组
while(right<arraylist.size()){
if(arraylist.get(left)!=arraylist.get(right)){
left++;
arraylist.set(left,arraylist.get(right));//rigth所指向的元素值覆盖left指向元素的下一个元素
}
else
right++;//right指向下一个元素
}
//left+1为新数组的长度,删掉left+1之后的元素
for(int k=right;k>left+1;k--){
arraylist.remove(k);
}
return arraylist;
}
}
}
8.和第7题类似也是针对数组去重,不过条件改为允许重复元素最多出现2次,输出新的数组。
例如,给定数组array={1,2,2,2,3,3,5},输出为{1,2,2,3,3,5}
solution:
算法的大体框架和第7题类似,只是在实现的细节上有一点变化。
一是left和right的初始位置不在是0和1,而是1和2
二是放宽了将right所指向的元素值赋给left指向的下一个元素的条件。由原先的left和right所指向的元素不相等再并上right所
指向的元素和left指向的前一个元素不相等。具体的实现代码如下所示:
import java.util.ArrayList;
public class question8 {
ArrayList<Integer> removeDplicates(ArrayList<Integer> arraylist) {
if (arraylist.isEmpty() || arraylist.size() <3) {//注意从3个以上开始,left和right初始位置指向第2和第3个
return arraylist;
} else {
int left = 1, right = 2;
while (right < arraylist.size()) {
if (arraylist.get(left) != arraylist.get(right)
|| arraylist.get(left - 1) != arraylist.get(right)) {
//left和right所指向的元素不相等或者left指向的前一个元素和right指向的元素不等,才覆盖元素
left++;
arraylist.set(left, arraylist.get(right));
} else
right++;
}
for (int k = arraylist.size(); k > left + 1; k--) {
arraylist.remove(k);
}
return arraylist;
}
}
}
就像上面提到过的,由于题目要求输出新的数组,而一般的数组中length是final不能修改,所以使用ArrayList表示数组。
如果题目只是要求输出新数组的长度,可以使用一般的数组实现这个算法。具体代码如下所示:
public class question8 {
int removeDuplicates(int[] array) {
if (array == null || array.length < 3) {
return array.length;
} else {
int left = 1, right = 2;
while (right < array.length) {
if (array[left] != array[right]
|| array[left - 1] != array[right]) {
left++;
array[left] = array[right];
} else
right++;
}
return left + 1;//返回新数组的长度为left+1
}
}
}
例如,array={1,2,3,3,3,5,7},输出新数组{1,2,3,5,7}
solution:
算法中使用两个指针left和right,分别用于标识元素的下标。left由0开始向下标增大的方向移动,而right初始位置由index
为1的位置同样向着下标增大的方向移动。right逐步遍历数组中的每个元素,
当array[left]!=array[right],将right所指向的元素赋值给left所指向的元素的下一个元素,并且left指向一个元素。
当array[left]==array[right],right指向下一个元素。left则是原地不动。具体实现的代码如下:
import java.util.ArrayList;
public class question7 {
ArrayList<Integer> removeDuplicates(ArrayList<Integer> arraylist) {
//由于该方法需要改变数组的长度,而一般的数组length标识为final,所以本题使用ArrayList
//如果只是return新数组的长度则可以使用一般的数组
if ((arraylist.isEmpty())|| arraylist.size()==1) {
return arraylist;
} else {
int left=0,right=1;//left记录新数组的最后一个位置,right实现遍历数组
while(right<arraylist.size()){
if(arraylist.get(left)!=arraylist.get(right)){
left++;
arraylist.set(left,arraylist.get(right));//rigth所指向的元素值覆盖left指向元素的下一个元素
}
else
right++;//right指向下一个元素
}
//left+1为新数组的长度,删掉left+1之后的元素
for(int k=right;k>left+1;k--){
arraylist.remove(k);
}
return arraylist;
}
}
}
8.和第7题类似也是针对数组去重,不过条件改为允许重复元素最多出现2次,输出新的数组。
例如,给定数组array={1,2,2,2,3,3,5},输出为{1,2,2,3,3,5}
solution:
算法的大体框架和第7题类似,只是在实现的细节上有一点变化。
一是left和right的初始位置不在是0和1,而是1和2
二是放宽了将right所指向的元素值赋给left指向的下一个元素的条件。由原先的left和right所指向的元素不相等再并上right所
指向的元素和left指向的前一个元素不相等。具体的实现代码如下所示:
import java.util.ArrayList;
public class question8 {
ArrayList<Integer> removeDplicates(ArrayList<Integer> arraylist) {
if (arraylist.isEmpty() || arraylist.size() <3) {//注意从3个以上开始,left和right初始位置指向第2和第3个
return arraylist;
} else {
int left = 1, right = 2;
while (right < arraylist.size()) {
if (arraylist.get(left) != arraylist.get(right)
|| arraylist.get(left - 1) != arraylist.get(right)) {
//left和right所指向的元素不相等或者left指向的前一个元素和right指向的元素不等,才覆盖元素
left++;
arraylist.set(left, arraylist.get(right));
} else
right++;
}
for (int k = arraylist.size(); k > left + 1; k--) {
arraylist.remove(k);
}
return arraylist;
}
}
}
就像上面提到过的,由于题目要求输出新的数组,而一般的数组中length是final不能修改,所以使用ArrayList表示数组。
如果题目只是要求输出新数组的长度,可以使用一般的数组实现这个算法。具体代码如下所示:
public class question8 {
int removeDuplicates(int[] array) {
if (array == null || array.length < 3) {
return array.length;
} else {
int left = 1, right = 2;
while (right < array.length) {
if (array[left] != array[right]
|| array[left - 1] != array[right]) {
left++;
array[left] = array[right];
} else
right++;
}
return left + 1;//返回新数组的长度为left+1
}
}
}