面试:字符串中的相关试题
题目1.:实现一个算法来判断一个字符串中的字符是否唯一(即没有重复).不能使用额外的数据结构。 (即只使用基本的数据结构)
首先,你可以问面试官,构成字符串的字符集有多大?是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.:一个字符串中,求出现次数最多的那个字母及次数,如果有多个重复的则都求出。
- 引入TreeSet:通过集合快速找到所有出现的字符串
- 引入ArrayList:为了快速排序,再通过StringBuilder生成排序后的字符串
- 通过String API中的基本方法indexOf,lastIndexOf来计算TreeSet中每个字符串的最大值
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);
}