1. 程式人生 > >牛客網程式設計師面試金典:1.1確定字元互異(java實現)

牛客網程式設計師面試金典:1.1確定字元互異(java實現)

問題描述:

請實現一個演算法,確定一個字串的所有字元是否全都不同。這裡我們要求不允許使用額外的儲存結構。

給定一個string iniString,請返回一個bool值,True代表所有字元全都不同,False代表存在相同的字元。保證字串中的字元為ASCII字元。字串的長度小於等於3000。
測試樣例:

“aeiou”

返回:True

“BarackObama”

返回:False

思路1:

最直接的做法莫過於用雙迴圈,兩兩比較字串,但是時間複雜度O(n^2)

程式碼:

public boolean checkDifferent(String iniString) {
        // write code here
if(iniString == null){ return false; } if(iniString.length() == 0){ return true; } StringBuilder sd = new StringBuilder(iniString); //雙for迴圈 for(int i = 0; i < sd.length(); i++){ for(int j = i+1; j < sd.length(); j++){ if
(sd.charAt(i) == sd.charAt(j)){ return false; } } } return true; }

思路2:

對原始字串進行排序O(nlogn),然後遍歷比較相鄰的字元的大小。總的還是O(nlogn).

程式碼:

import java.util.*;

public class Different {
    public boolean checkDifferent(String iniString) {
        // write code here
if(iniString == null || iniString.length() > 3000){ return false; } if(iniString.length() == 0){ return true; } // System.out.println(iniString); char[] arr = iniString.toCharArray(); QuickSort(arr, 0, iniString.length()-1); // StringBuilder sd = new StringBuilder(arr.toString()); for(char ch : arr){ System.out.print(ch); } System.out.println(); for(int i = 0; i < arr.length-1; i++){ if(arr[i] == arr[i+1]){ return false; } } return true; } public int Partition(char[] arr, int start, int end){ if(arr == null || arr.length == 0 || start < 0 || end < 0){ return -1; } int index = start + (int)(Math.random() * ((end - start) + 1));//隨機選擇一個作為標杆的數字 //將標杆放在陣列最後一位 // System.out.println(arr.toString()); // System.out.println(arr[index]); // System.out.println(arr[end]); char tmp = arr[index]; arr[index] = arr[end]; arr[end] = tmp; int small = start - 1;//small用來儲存從右到左第一個小於標杆的數字的下標 for(index = start; index < end; index++){ if(arr[index] < arr[end]){//如果小於標杆 small++;//更新第一個小的 if(small != index){//如果當前遍歷的不是第一個小的 tmp = arr[index];arr[index] = arr[small];arr[small] = tmp;//將當前遍歷的數字放在第一個小的位置上 } } } //由於small指示的是從右到左第一個小於標杆的,而此時標杆還放在陣列最後,因此,應該將標杆放在small後面一位。 small++; tmp = arr[small];arr[small] = arr[end]; arr[end] = tmp; return small;//返回位置為所選擇的標杆最後的位置 } public void QuickSort(char[] arr, int start, int end){ if(start == end){ return; } int index = Partition(arr, start, end); if(index > start){ QuickSort(arr, start, index - 1); } if(index < end){ QuickSort(arr, index + 1, end); } } }

思路3:

每次遍歷一個字元,檢查當前字元是否出現在後續字串中(和思路1其實是一樣的,只不過下面利用了java庫函式來實現的)

import java.util.*;

public class Different {
    public boolean checkDifferent(String iniString) {

     if(iniString == null || iniString.length() > 3000){
            return false;
        }

        if(iniString.length() == 0){
            return true;
        }

        for(int i = 0; i < iniString.length() - 1; i++){
            if(iniString.substring(i+1).contains(iniString.subSequence(i, i+1))){
                return false;
            }
        }

        return true; 

    }
}

PS:下面是在牛客網上提交程式,三者的時間消耗與空間消耗

時間:42ms,149ms,35ms
空間:649KB,1868KB,728KB

另外原題目中要求不能使用其他的儲存結構,那麼只有3是滿足條件的。