面试题 01.01. 判定字符是否唯一(包括一些逻辑运算)

实现一个算法,确定一个字符串 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;
	    }
}   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值