每日算法(十五)-java给定一个有序数组,删除其中重复元素,只保留一个,并返回新数组的长度
Example 2:
Given nums = [0,0,1,1,1,2,2,3,3,4],
Your function should return length = 5, with the first five elements of nums being modified to 0, 1, 2, 3, and 4 respectively.
常规方法一:
新建一个数组来放最后的结果,由于不知道大小,就先与原数组大小相同,然后直接遍历原数组,第一次遍历从第一个数开始,第二个遍历从第二个数开始依次往后,如果第一个数与第二个数相等,则将预先设定的boolean类型的值更改为false并跳出循环,判断boolean类型的值是否为ture,是则将该值放入结果数组中,最后数组里面放的就都是不重复的元素,但需要注意的是我们一开始设定的大小为和原数组相同,所以没有放入的则默认都会0;所以这里还需要再新建一个数组,将得到的结果数组复制到新数组,新数组的大小可以在判断那里初始一个值来计录次数,最后的次数则为新数组的大小,代码如下:
public class ArrrayLength {
public static int[] returnLength(int arr[]){
int t=0;
int temparr[]=new int[arr.length];
for(int i=0;i<arr.length;i++){
boolean isture=true;
for(int j=i+1;j<arr.length;j++){
if(arr[i]==arr[j]){
isture=false;
break;
}
}
if(isture){
temparr[t]=arr[i];
t++;
}
}
int newarr[]=new int[t];
System.arraycopy(temparr, 0, newarr, 0, t);
return newarr;
}
第二种巧妙方式:
很容易想到链表的方式,利用其contains方法进行比较,不同则add放入链表,最终结果则为无重复的链表,最后再toarray遍历即可,toarray之前先新建一个数组大小了链表的size;代码如下:
public class ListLength {
public static List<Integer> returnList(int arr[]){
List<Integer> list =new ArrayList<>();
for(int i=0;i<arr.length;i++){
if(!list.contains(arr[i])){
list.add(arr[i]);
}
}
return list;
}
public static void main(String[] args) {
int arr[]={0,0,1,1,1,2,2,3,3,4};
List<Integer> temp=returnList(arr);
Object[] a=new Object [temp.size()];
a=temp.toArray();
for(int i=0;i<a.length;i++){
System.out.println(a[i]);
}