实现一个算法,确定一个字符串 s 的所有字符是否全都不同。
示例 1:
输入: s = “leetcode”
输出: false
示例 2:
输入: s = “abc”
输出: true
限制:
0 <= len(s) <= 100
如果你不使用额外的数据结构,会很加分。
这题的题意就是判断是否有重复的字符,单单按照这个去做的话确实很简单,但是他说如果不使用额外的数据结构会很加分,那我们就要去从不用额外的数据结构的方向去做了,实在是是想不出什么好的方法了,不创的话就只有暴力法,还有我脑子里的交换了,比如1到10的整型数组,打乱的,那么1就在1的位置上,2在2的位置上,如果发现有了就是重复,也就是遍历一遍,但是这个是字符,且长度不是一定超过26的,所以真的没想出来。
官方的题解就显的非常牛了,他是创了一个int型,把int型当成了一个bool型的数组,用二进制下的01来做。
先记录一下java中的逻辑运算:
异或 ^ 不同为1,相同为0 如:0100 ^ 1000 = 1100
(而且异或有一个用处就是不借助第三方的变量来进行交换,如
a ^= b;
b ^=a;
a ^= b;
这就不用借助第三方的变量来交换了
)
与 & 只有双方都为1的时候才为1 如:1011 & 1001 = 1001
或 | 只要有1 则为1 如: 10010 | 11001 = 11011
左移 <<
右移 >>(尖头在哪就向那边移动)
借助上述的一些逻辑运算就可以完成这题了
先将移动的位计算出来,就是: mark = astr.charAt(i) - 'a'
,得出了位移量就可以做了,判断在该位置上是否为1,那么我们用什么,用&,如果bl与位移量与运算后不相同的话就为0 ,如果相同就大于0了,那么这题就完成了,代码如下:
class Solution {
public boolean isUnique(String astr) {
int bl = 0;
for(int i = 0;i < astr.length();i++){
int mark = astr.charAt(i) - 'a';
if((bl & 1 << mark) != 0){//用&来判断该位置上是否为1
return false;
}
bl |= (1 << mark);//在位移的位置上变换为1
}
return true;
}
}