程序員面試金典(三)--數組和字符串

題目1:實現一個算法,確定一個字符串的所有字符是否全都不同。假使不允許使用額外的數據結構,又如何處理?

對於這樣的題目,首先要考慮字符串的編碼方式,是Unicode還是ASCⅡ。假設使用ASCⅡ,有256個字符。
下面是具體的代碼實現:

package com.czl.question;

public class TestStr {
    public boolean isUniqueChars(String str){
        if (str.length() > 256) {
            return false;
        }
        boolean[] char_set = new boolean[256];
        for (int i = 0; i < str.length(); i++) {
            int val = str.charAt(i);
            if (char_set[val]) {//如果這個字符已經出現過,返回false
                System.out.println("有重複");
                return false;
            }
            char_set[val] = true;
        }
        System.out.println("沒有重複");
        return true;
    }
    public static void main(String[] args) {
        String string = "14124235qwertymdaldnmzd";
        TestStr testStr = new TestStr();
        testStr.isUniqueChars(string);
    }
}

此種解法的時間複雜度爲O(n) ,其中n 爲字符串長度,空間複雜度爲O(1)

如果,將字符串中的每一個字符與其餘字符進行比較,不需要考慮字符類型,這種方法的時間複雜度爲O(n2) ,空間複雜度爲O(1)

package com.czl.question;

public class TestUniqueStr {

    public boolean isUnique(String str){
        char[] tempchar = str.toString().toCharArray();

        for (int i = 0; i < tempchar.length; i++) {
            for (int j = i + 1; j < tempchar.length; j++) {
                if (tempchar[i] == tempchar[j]) {

                    System.out.println("有重複");
                    return false;
                }
                System.out.println("沒有重複");
                return true;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        String string = "qwerabc";
        TestUniqueStr tus = new TestUniqueStr();
        tus.isUnique(string);

    }
}

題目2:給定兩個字符串,請編寫程序,確實其中一個字符串的字符重新排列後,能否變成另一個字符串。

分析:首先,針對變位詞比較是否區分大小寫,一般字符串中存在的空格是否需要考慮,比較兩個字符串時,只要兩者長度不同,就不是變位詞。

解法一:排序字符串

若兩個字符串互爲變位詞,那麼他們擁有同一組字符,自不過順序不同。因此,對字符串排序,組成兩個變位詞的字符就會有相同的順序,比較排序後的字符串即可。

public class Question2 {
    public String sort(String s){
        char[] content = s.toString().toCharArray();
        java.util.Arrays.sort(content);
        return new String(content);
    }
    public boolean permutation(String s,String t){
        if (s.length() != t.length()) {
            return false;
        }
        return sort(s).equals(sort(t));
    }
    public static void main(String[] args) {
        Question2 q = new Question2();
        String s = "goodod";
        String t = "doodog";

        System.out.println(q.permutation(s, t));
    }
}

解法二:檢查兩個字符串的各字符數是否相同

根據變位詞的定義,可以知道組成兩個變位詞的字符數相同。只需要遍歷字母表,計算每個字符出現的次數,然後比較兩個數組即可。

public class Question2_1 {
    public boolean permutation(String s,String t){
        if (s.length() != t.length()) {
            return false;
        }

        int[] letters = new int[256];//假設條件
        char[] char_set = s.toString().toCharArray();
        for (char c : char_set) {//計算字符串s中每個字符出現的次數
            letters[c]++;
        }

        for (int i = 0; i < t.length(); i++) {
            int c = (int)t.charAt(i);
            if (--letters[c] < 0) {
                return false;
            }
        }
        return true;
    }
    public static void main(String[] args) {
        Question2_1 q = new Question2_1();
        String s = "goodmoon";
        String t = "noom!doog";
        String t1 = "nooomdog";

        System.out.println(q.permutation(s, t));
        System.out.println(q.permutation(s, t1));
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章