查看: 1837| 回复: 11
跳转到指定楼层
上一主题 下一主题
收起左侧

简单的位运算,但是不懂原理

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
在看判断一个字符串中的字符是否唯一(只用基本数据结构)的程序中,发现它用了位运算来求解,自己动手算了一下,但是自己对于位运算接触的太少,不解其中的原理,请教各位,程序里左移是为什么呢?这个程序的基本思想是什么呀?谢谢!
  1.   public static boolean isUniqueChars(String str) {
  2.     int checker = 0;
  3.     for (int i = 0; i < str.length(); ++i) {
  4.       int val = str.charAt(i) - ‘a’;
  5.       if ((checker & (1 << val)) > 0) return false;
  6.       checker |= (1 << val);
  7.     }
  8.     return true;
  9.   }
复制代码

点评

感觉这个方法太难想到了。。  发表于 2015-7-20 14:21

评分

参与人数 1大米 +1 收起 理由
osto + 1 感谢分享!

查看全部评分


上一篇:求问一个Python基础问题
下一篇:第82道题,删除链表里重复节点(只要重复,一个都不保留)
🔗
rogerdai 2015-7-19 23:19:58 | 只看该作者
全局:
这是用每一个bit对应字符. 如果出现过,那么checker上这个bit就为1,不然就是0. 这里应该是假设所有输入都只有小写字符,不然31个bit装不下48个字符
回复

使用道具 举报

🔗
 楼主| 神罗天征 2015-7-19 23:26:12 | 只看该作者
全局:
rogerdai 发表于 2015-7-19 23:19
这是用每一个bit对应字符. 如果出现过,那么checker上这个bit就为1,不然就是0. 这里应该是假设所有输入都 ...

恍然大悟啊,它确实假设了只有小写字母,谢谢!
回复

使用道具 举报

🔗
zhuli19901106 2015-7-20 00:49:03 | 只看该作者
全局:
位运算很好玩,习惯了以后你会喜欢的~~
回复

使用道具 举报

🔗
水逼一枚 2015-7-20 14:20:25 | 只看该作者
全局:
zhuli19901106 发表于 2015-7-20 00:49
位运算很好玩,习惯了以后你会喜欢的~~

请问一下这个题你们是第一次做的时候就想到这个位运算的方法了?
回复

使用道具 举报

🔗
水逼一枚 2015-7-20 14:20:39 | 只看该作者
全局:
rogerdai 发表于 2015-7-19 23:19
这是用每一个bit对应字符. 如果出现过,那么checker上这个bit就为1,不然就是0. 这里应该是假设所有输入都 ...

请问一下这个题你们是第一次做的时候就想到这个位运算的方法了?
回复

使用道具 举报

🔗
rogerdai 2015-7-20 15:10:40 | 只看该作者
全局:
水逼一枚 发表于 2015-7-20 14:20
请问一下这个题你们是第一次做的时候就想到这个位运算的方法了?

没有第一次想到,如果第一次做,我可能会用一个boolean[52]来check。(假设大小写都有)
但是在开始check之前要check输入的字符串长度小于等于52,不然直接返回false了

点评

感谢回复。  发表于 2015-7-20 22:33
感谢回复。  发表于 2015-7-20 22:32
回复

使用道具 举报

🔗
zhuli19901106 2015-7-20 16:35:04 | 只看该作者
全局:
水逼一枚 发表于 2015-7-20 14:20
请问一下这个题你们是第一次做的时候就想到这个位运算的方法了?

这题我没用位运算啊,用32位整数来表示一个26元素的数组当然可以,不过我觉得水题上用这些技巧没必要。
我通常都是感到用数组会导致空间或效率问题时,才去用位运算来压缩。否则有点杀鸡用牛刀的感觉。
比如像这种题:http://poj.org/problem?id=1198
你要是不用位运算压缩状态的话,根本过不去。

点评

感谢回复。  发表于 2015-7-20 22:32
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表