1. 程式人生 > >Array And String(數組和字符串)

Array And String(數組和字符串)

每一個 重新 存儲 pack 分享 nbsp ret 數據結構 con

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

技術分享
public class UniqueChars {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String string = "abcdefgfedcba";
        System.out.print(isUniqueChars(string));
            
    }
    public static 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]) { return false; } char_set[val]
= true; } return true; } }
View Code

註意:向面試官確認上面的字符串是ASCII字符串還是Unicode字符串。若不是ASCII字符串需擴大存儲空間,但其余邏輯不變。

這裏假定是ASCII字符串。首先做一個優化,若字符串長度大於字母表中的字符個數,就直接返回false。畢竟,若字母表只有256個字符,字符串裏就不可能有280個各不相同的字符。

然後構建一個布爾值的數組,索引值i對應的標記指示該字符串是否含有字母表第i個字符。若這個字符第二次出現,則立即返回false。時間復雜度o(n),空間復雜度o(1)。

若不允許使用額外的數據結構:

(1)將字符串中的每一個字符與其余字符進行比較。時間復雜度為o(n2),空間復雜度o(1)。

技術分享
public class UniqueChars {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String string = "abcdefgfedcba";
        System.out.print(isUniqueChars(string));
            
    }
   
    public static boolean isUniqueChars(String str) {
        if (str.length() > 256) {
            return false;
        }
        for(int i = 0; i < str.length(); i++) {
            for(int j = i + 1; j < str.length(); j++) {
                if(str.charAt(i) == str.charAt(j)) return false;
            }
        }
        return true;
    }
}
View Code

(2)若允許修改輸入字符串,可以在o(nlogn)的時間裏對字符串排序,然後線性檢查其中有無相鄰字符完全相同的情況。

2.用Java實現void reverse(char* str)函數,即反轉一個null結尾的字符串。

技術分享
package ArrayAndString;

public class Reverse {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String string = "abcdefg";
        System.out.println(reverseString2(string));
    }
    //最簡單的方法
    public static String reverseString(String iniString) {
        // write code here
        StringBuffer tmp = new StringBuffer(iniString);
        tmp = tmp.reverse();
        return tmp.toString();
    }
    //最常用的方法
    public static String reverseString2(String iniString) { 
         char[] array = iniString.toCharArray(); 
         String reverse = "";  //註意這是空串,不是null
         for (int i = array.length - 1; i >= 0; i--) { 
             reverse += array[i];
         }
         return reverse; 
     } 

}
View Code

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

解法一:對字符串排序後進行比較,若它們擁有相同順序的字符,即互為變位詞。

技術分享
import java.util.*;

public class IsAnagram {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String string1 = "aceg";
        String string2 = "cega";
        System.out.println(permutation(string1, string2));    
    }
    
    public static String sort(String s) {
        char[] content = s.toCharArray();
        Arrays.sort(content);
        return new String(content);
    }
    
    public static boolean permutation(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        return sort(s).equals(sort(t));
    }

}
View Code

解法二:利用變位詞的定義--組成兩個單詞的字符數相同,遍歷字母表,計算每個字符出現的次數,然後比較這兩個數組。

技術分享
public class IsAnagram {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String string1 = "aceg";
        String string2 = "cega";
        System.out.println(permutation(string1, string2));    
    }
    public static boolean permutation(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        
        int[] letters = new int[256];
        char[] s_array = s.toCharArray();
        for (char c : s_array) {
            letters[c]++;
        }
        for (int i = 0; i < t.length(); i++) {
            int c = (int) t.charAt(i);
            if (--letters[c] < 0) {
                return false;
            }
        }
        return true;
    }

}
View Code

註意:向面試官確認 變位詞是否區分大小寫 以及 是否要考慮空白字符。

這裏假定變位詞比較區分大小寫,空白也要考慮在內,是ASCII字符串。首先做一個優化,比較兩個字符串的長度,只要長度不同就不可能是變位詞。

4.編寫一個方法,將字符串中的空格全部替換為“%20”。假定該字符串尾部有足夠的空間存放新增字符,並且知道字符串的“真實”長度。(註:用Java實現的話,請使用字符數組實現,以便直接在數組上操作。)

思路:進行兩次掃描。第一次掃描先數出字符串種有多少空格,從而算出最終的字符串有多長。第二次掃描真正開始反向編輯字符串,檢測到空格則將%20復制到下一個位置,若不是空白,就復制原先的字符。

註意:處理字符串操作問題時,常見做法是從字符串尾部開始編輯,從後往前反向操作。因為字符串尾部有額外的緩沖,可以直接修改,不必擔心會復寫原有數據。

Array And String(數組和字符串)