Array And String(數組和字符串)
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 booleanView CodeisUniqueChars(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; } }
註意:向面試官確認上面的字符串是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(數組和字符串)