作者bleed1979 (十三)
看板java
标题Re: [问题] <<和|=的意思
时间Thu Mar 6 09:31:57 2014
※ 引述《yule1224 (我是B型)》之铭言:
: 现在在看Cracking The Coding Interview
: 里面一段java看不太懂
: 1<<val 是不是指 val所有位元向左边移一个位子,然後最右边的放入0
: 为什麽要用(1<<val)>0 来当做检验字母有没有重复的其中一项因素呢?
: 还有我也看不太懂 checker |=(1<<val);
: 这个程式是用来判断string里的字母是不是都不相同
题外:就程式写法,这个字串应该只有小写字母。
正题:
checker在x86理应是4 bytes,32 bits。
初始化为0代表所有bits都没有设立。
先把他想成一个32个栏位全部都是0的array。
程式做法:
每每碰到一个字串里的字元,先检查在array相应的栏位是否有值为1,
如果有值代表重复,
没有值的话那我就在相应的栏位设定值1(下一次碰到一样字元就知道重复)。
array的想法你能接受的话,就可以转换来想checker。
: public boolean isUniqueChars(String str){
: if (str.length()> 256) return false;
: int checker = 0;
: for (int i=0; i<str.length(); i++){
: int val=str.charAt(i) - 'a';
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
checker有32个位置,
如果此字串都只有英文小写字母,那减去'a'知後val顶多是0 ~ 25
: if((checker & (1<<val))>0{
1 << val 为 位於bit0的1移位到第val位,也就是设定第val栏位为1。
checker 做 & 运算会大於0,
表示checker的第val栏位已经被设定(因为true and true 为 true),代表重复。
如果checker的第val栏位没有被设定,那麽 & (1<<val)就不会大於0
: return false;
: }
: checker |= (1<<val);
因为不会大於0,代表第一次出现,那麽用 checker = checker | (1 << val);
来设定表示第val栏位的字元已经出现过。
: }
: return true;
: }
: 谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 210.63.96.2
1F:→ realmeat:大写也可以, A到a刚好差32 03/06 09:41
2F:→ danny8376:哪来可以啊... B不就overflow了... 03/06 13:57
3F:→ danny8376:另外 大写减小写的话是负值好吗... 03/06 13:59
4F:推 yule1224:抱歉我写错了 是要判断不同的char 不是字母 :P 03/07 01:26
5F:推 yule1224:所以一开始就用 str.length()>256 来判断是否有重复 03/07 01:28
6F:→ yule1224:你解释的很详尽 我懂了 谢谢 03/07 01:30