刪除排序數組中的重複元素

題目大意

  給定一個排序的數組,將數組中的重複元素去掉,相同的只保留一個,而且返回數組新的元素個數,不要建立一個新的數組來保存結果。在常量時間內解決這個問題php

解題思路

  從第二個元素開始處理,記爲當前處理的元素,若是當前元素與他的前一個元素相同就刪除這個元素,若是不一樣就將它移動到正確的位置,返回最後數組元素人個數。java

代碼實現

算法實現類算法

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:若是數組裏面不存在元素或者只存在一個元素,那麼就不須要進行比較,直接返回數組的長度便可;ruby

2:數組長度大於一的話那麼就須要比較數組的相鄰的兩個元素,若是相等 的話那麼後一個元素的指針日後移一位,而後前一個元素的指針接着日後移一位,將當先後一個元素指針所指的數字賦給前一個元素指針所指的位置,而後後一元素指針繼續加一。若是相鄰倆個元素不等的話,則直接前一元素指針加一與後一元素重合,而後後一元素指針繼續加一。spa

代碼以下:.net

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; code

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();

  }

}

相關文章
相關標籤/搜索