187. Repeated DNA Sequences | Java最短代码实现
2016-03-24 20:53
351 查看
原题链接:187. Repeated DNA Sequences
【思路】
本题考查hashmap和位运算的综合。我们首先来看字母 ”A" "C" “G" "T" 的ASCII码,分别是65, 67, 71, 84,二进制表示为 1000001, 1000011, 1000111, 1010100。可以看到红色部分2bit
就可以区分不同的字符。那么一共需要2 × 10 = 20bit,用第21 - 1位就可以存储10个字母,然后把这20位值转化为int作为hashmap的key,来判断该字符是否出现过:
30 / 30 test
cases passed. Runtime: 49
ms Your runtime beats 32.71% of javasubmissions.
欢迎优化!
【思路】
本题考查hashmap和位运算的综合。我们首先来看字母 ”A" "C" “G" "T" 的ASCII码,分别是65, 67, 71, 84,二进制表示为 1000001, 1000011, 1000111, 1010100。可以看到红色部分2bit
就可以区分不同的字符。那么一共需要2 × 10 = 20bit,用第21 - 1位就可以存储10个字母,然后把这20位值转化为int作为hashmap的key,来判断该字符是否出现过:
public List<String> findRepeatedDnaSequences(String s) { List<String> result = new ArrayList<String>(); HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(); int key = 0; for (int i = 0; i < s.length(); i++) { key = ((key << 2) | (s.charAt(i) & 0x6)) & 0x1fffff; if (i < 9) continue; if (map.get(key) == null) { //以前未出现过该字符串 map.put(key, 1); } else if (map.get(key) == 1) { //该字符串已出现过一次 result.add(s.substring(i - 9, i + 1)); map.put(key, 2); //标记该字符串出现超过一次 } } return result; }
30 / 30 test
cases passed. Runtime: 49
ms Your runtime beats 32.71% of javasubmissions.
欢迎优化!
相关文章推荐
- Android中的UI刷新
- Builder 模式
- POJ 3061 Subsequence【尺取法】
- Cstyle的UEFI导读:第18.0篇 NVRAM的工作原理(上)
- 2015 UESTC Training for Dynamic Programming N - 导弹拦截 LIS nlog(n)+打印字典序最小的路径
- 【HPU】[1738]Stack ? Queue ?
- 扣丁学堂笔记第07天高级UI组件(三)
- 看慕课网节日短信祝福UI自我总结实现过程
- 【UVA11538】Chess Queen——简单组合
- UIKit框架各个类的简介
- DuiLib介绍及其消息处理剖析
- Can you answer these queries?(线段树)
- codeforces 597C C. Subsequences(dp+树状数组)
- LeetCode: Longest Consecutive Sequence [128]
- Castle Windsor Fluent Registration API
- collection系列用法-deque双向队列
- android学习——res/values/contentDescription报错
- juery中循环遍历json数组
- UIKeyboardTypeNumberPad 数字键盘自定义按键
- 来段代码提提神-Java读取config.properties文件中的key=value