題目1.:實現一個算法來判斷一個字符串中的字符是否惟一(即沒有重複).不能使用額外的數據結構。 (即只使用基本的數據結構)java
首先,你能夠問面試官,構成字符串的字符集有多大?是ASCII字符,仍是隻是26個字母? 仍是有更大的字符集,對於不一樣的狀況,咱們可能會有不一樣的解決方案。面試
若是咱們假設字符集是ASCII字符,那麼咱們能夠開一個大小爲256的bool數組來表徵每一個字 符的出現。數組初始化爲false,遍歷一遍字符串中的字符,當bool數組對應位置的值爲真, 代表該字符在以前已經出現過,便可得出該字符串中有重複字符。不然將該位置的bool數組 值置爲true。代碼以下:算法
//若是字符集只是a-z(或是A-Z),那就更好辦了,用位運算只須要一個整型數便可。 public static boolean stringDiff(String str) { int checker = 0; for (int i = 0; i < str.length(); ++i) { int val = str.charAt(i) - 'a'; if ((checker & (1 << val)) > 0) return false; checker |= (1 << val); } return true; } //bool數組實現 public static boolean stringDiff2(String str) { 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; } //int數組,位表示 public static boolean stringDiff(String string) { int[] a = new int[8]; int len = string.length(); for(int i=0; i < len; ++i) { int v = (int)string.charAt(i); int idx = v / 32; int shift = v % 32; if((a[idx] & (1 << shift)) > 0) return false; a[idx] |= (1 << shift); } return true; }
題目2.:一個字符串中,求出現次數最多的那個字母及次數,若是有多個重複的則都求出。數組
public static void doString(String input) { char[] charArr = input.toCharArray(); List list = new ArrayList(); TreeSet set = new TreeSet(); for(int i = 0; i < charArr.length; i++) { list.add(charArr[i]); set.add(charArr[i]); } System.out.println(set); Collections.sort(list); System.out.println(list); StringBuilder sb = new StringBuilder(); for(int i = 0; i < list.size(); i++) { sb.append(list.get(i)); } input = sb.toString(); System.out.println(input); int maxNum = 0; String maxString = ""; List maxList = new ArrayList(); Iterator iterator = set.iterator(); while(iterator.hasNext()) { String str = iterator.next().toString(); int startIndex = input.indexOf(str); int lastIndex = input.lastIndexOf(str); int tempMax = lastIndex - startIndex + 1; if(tempMax > maxNum) { maxNum = tempMax; maxString = str; maxList.add(str); } else if(tempMax == maxNum) { maxList.add(str); } } int index = 0; for(int i = 0; i < maxList.size(); i++) { if(maxList.get(i).equals(maxString)) { index = i; break; } } System.out.println("max data: "); for(int i = index; i < maxList.size(); i++) { System.out.print(maxList.get(i) + " "); } System.out.println(); System.out.println("max: " + maxNum); }