题目大意
给定一个排序的数组,将数组中的重复元素去掉,相同的只保留一个,并且返回数组新的元素个数,不要创建一个新的数组来保存结果。在常量时间内解决这个问题
解题思路
从第二个元素开始处理,记为当前处理的元素,如果当前元素与他的前一个元素相同就删除这个元素,如果不同就将它移动到正确的位置,返回最后数组元素人个数。
代码实现
算法实现类
public class Solution {
public int removeDuplicates(int[] A) {
if (A.length == 0) {
return 0;
}
int index = 0;//[0,index]只记录数组中出现的按从小到大的唯一一个数,已经排好序了
int next = 1;
// 算法思想:找index之后的比A[index]大的数,如是找到就移动到A[index+1]处,
// index移动到下一个位置,next移动到下一个位置,再找比A[index]大的数
while (next < A.length) {
while (next < A.length && A[index] == A[next] ) { // 找不等于数组中最
next++;
}
if (next < A.length) {
index++;
A[index] = A[next];
next++;
}
}
return index + 1;
}
private void swap(int[] a, int x, int y) {
int tmp = a[x];
a[x] = a[y];
a[y] = tmp;
}
}
思路:一个数组是有序的,所以算法实现起来相对比较简单,因为只需比较数组相邻的两个数字即可,存在两种情况
1:如果数组里面不存在元素或者只存在一个元素,那么就不需要进行比较,直接返回数组的长度即可;
2:数组长度大于一的话那么就需要比较数组的相邻的两个元素,如果相等 的话那么后一个元素的指针往后移一位,然后前一个元素的指针接着往后移一位,将当前后一个元素指针所指的数字赋给前一个元素指针所指的位置,然后后一元素指针继续加一。如果相邻俩个元素不等的话,则直接前一元素指针加一与后一元素重合,然后后一元素指针继续加一。
代码如下:
public class Solution {
public int removeDuplicates(int[] A) {
int i=0;
int j=1;
if(A.length==0||A.length==1){
return A.length;
}
while(i<A.length&&j<A.length){
if(A[i]==A[j]){
j++;
}else{
A[++i]=A[j++];
}
}
return i+1;
}
}
import
java.util.List;
import
java.util.ArrayList;
import
java.util.Set;
import
java.util.HashSet;
public
class
lzwCode {
public
static
void
main(String [] args) {
testA();
System.out.println(
"==========================="
);
testB();
System.out.println(
"==========================="
);
testC();
}
//去掉数组中重复的值
public
static
void
testA() {
String [] str = {
"Java"
,
"C++"
,
"Php"
,
"C#"
,
"Python"
,
"C++"
,
"Java"
};
for
(String elementA:str ) {
System.out.print(elementA +
" "
);
}
List<String> list =
new
ArrayList<String>();
for
(
int
i=
0
; i<str.length; i++) {
if
(!list.contains(str[i])) {
list.add(str[i]);
}
}
/*
Set<String> set = new HashSet<String>();
for (int i=0; i<str.length; i++) {
set.add(str[i]);
}
String[] newStr = set.toArray(new String[1]);
*/
System.out.println();
String[] newStr = list.toArray(
new
String[
1
]);
//返回一个包含所有对象的指定类型的数组
for
(String elementB:newStr ) {
System.out.print(elementB +
" "
);
}
System.out.println();
}
//删除数组中其中一个元素
public
static
void
testB() {
String [] str = {
"Java"
,
"C++"
,
"Php"
,
"C#"
,
"Python"
};
for
(String elementA:str ) {
System.out.print(elementA +
" "
);
}
//删除php
List<String> list =
new
ArrayList<String>();
for
(
int
i=
0
; i<str.length; i++) {
list.add(str[i]);
}
list.remove(
2
);
//list.remove("Php")
System.out.println();
String[] newStr = list.toArray(
new
String[
1
]);
//返回一个包含所有对象的指定类型的数组
for
(String elementB:newStr ) {
System.out.print(elementB +
" "
);
}
System.out.println();
}
//在数组中增加一个元素
public
static
void
testC() {
String [] str = {
"Java"
,
"C++"
,
"Php"
,
"C#"
,
"Python"
};
for
(String elementA:str ) {
System.out.print(elementA +
" "
);
}
//增加ruby
List<String> list =
new
ArrayList<String>();
for
(
int
i=
0
; i<str.length; i++) {
list.add(str[i]);
}
list.add(
2
,
"ruby"
);
//list.add("ruby")
System.out.println();
String[] newStr = list.toArray(
new
String[
1
]);
//返回一个包含所有对象的指定类型的数组
for
(String elementB:newStr ) {
System.out.print(elementB +
" "
);
}
System.out.println();
}
}