本问题涉及位运算
解题思路
由于题中说不使用数据结构可以加分,考虑位运算
使用一个数例如int,32位,其中26位就可以满足a到z的字符串了
我们用1表示a,第26位为1表示z,这样用二进制来表示存贮是否出现过某个字母
- 扫描第一个字母,这个字母的ascii数值(也是hash值)减去a的hash值就是我们要向左移动的位数。
- 用一个数tmp记录当前的字母的位置数值例如c是100也就是4,将这个tmp与mark=0(目前没有字幕出现过)相与,显然结果都是0,将mark的值置为c出现过,也就是100。
- 接着重复上述步骤(mark的值在变化,若相与出现结果不为0那么就是有重复,跳出循环返回false。
public class Main {
public static void main(String[] args) {
System.out.println(isunique("abc"));
System.out.println(isunique("abca"));
}
/* 1. 扫描第一个字母,这个字母的ascii数值(也是hash值)减去a的hash值就是我们要向左移动的位数。
2. 用一个数tmp记录当前的字母的位置数值例如c是100也就是4,将这个tmp与mark=0(目前没有字幕出现过)相与,
显然结果都是0,将mark的值置为c出现过,也就是100。
3. 接着重复上述步骤(mark的值在变化,若相与出现结果不为0那么就是有重复,跳出循环返回false。*/
public static boolean isunique(String s){
int mark = 0;
int move,tmp;
for (char c:s.toCharArray()){
move=c-'a';
tmp = 1<<move;
if ((tmp & mark) ==0){
mark += tmp;
}else {
return false;
}
}
return true;
}
}
运行结果