1
imn1 2016-05-05 10:58:39 +08:00
位运算
|
2
abutter 2016-05-05 11:05:30 +08:00
这是做题还是有具体的需求?原始的需求是啥?
|
3
administrator321 OP @abutter 具体需求,就这样格式的,大概有 10 万个这样格式的数据,有没有好方法
|
4
administrator321 OP @imn1 具体可以说说嘛
|
5
jmc891205 2016-05-05 11:20:57 +08:00 1
把列表右移一位,然后新列表和原列表对应的位做比较, 0-0 和 1-1 结果记为 0 , 0-1 结果记为 1 , 1-0 结果记为 2 则
原列表:[1 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0] 新列表:[_ 1 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0] 比较 :[_ 1 0 2 0 0 0 0 1 0 0 2 0 0 0 0 1 0 _] 比较结果里除了首位两位, 1 的位置在新列表里就是 0 前面的 1 , 2 的位置在原列表里就是 0 后面的 1 连续的 0 就找 1 和 2 之间元素多于 1 个的就可以了 如果是二进制数的话也是这个思想,可以利用位运算 |
6
am241 2016-05-05 11:21:15 +08:00 via Android
这种问题遍历一遍就 ok 吧?还能有更好的方法?
|
9
jmc891205 2016-05-05 11:24:55 +08:00
@menc 哈哈 被一楼误导了 因为我的工作都是跟二进制数打交道比较多 所以直接拿位运算的思想来套了
楼主输入的是列表还是遍历一遍吧 |
10
loading 2016-05-05 11:26:27 +08:00
遍历一次,每一位都判断当前位和旁边的两位不就好了?
|
11
ytmsdy 2016-05-05 11:37:36 +08:00
遍历一遍, O(N)的时间复杂度,已经很快了。。。
|
12
kindjeff 2016-05-05 11:41:38 +08:00
10W 个 18 个 0 或 1 的列表?如果没有重复项的话肯定有大量连续的项。我觉得 10W 个可以先排一下序……然后连续多项只需要算出第一个项的 0 1 情况就可以推出接下去的连续项的 0 1 情况了吧(大概
随便想的并没有验算 |
13
araraloren 2016-05-05 11:50:01 +08:00
用正则表达式分分钟匹配出来,如果你说的是 10W 个长度的话
```perl6 #!/usr/bin/env perl6 for @*ARGS -> \file { file.IO.slurp ~~ m:g/'1' '0'**2..* '1'/; for $/.values { say "from:" ~ .from ~ " to:" ~ .to ~ " => " ~ .Str; } } ``` |
14
imn1 2016-05-05 12:01:16 +08:00
漏打个问号,误导别人了
“遍历”少不了,不过用位运算应该可以跳过部分(首位置 0 后判断 bit length ) while length => start 首位置 0 if length<start-1 then length => end 处理(长度与位置的关系)并记录 start/end loop 大致吧,由于 length 是跳跃的,比起 step=1 少处理一些 |
15
imn1 2016-05-05 12:07:50 +08:00
对于位数太长,不能使用位运算,就用 @araraloren 的正则思路吧
0+是指任意长度 0 的(贪婪),也可以跳跃不需要每位校验 |
16
hellosnow 2016-05-05 12:16:22 +08:00 via Android
在算游程?
|
17
administrator321 OP @loading 一个 10 万长度的这样的列表
|
18
yemenchun1 2016-05-05 13:02:00 +08:00
100 万个数, O(N*lg2(N))复杂度的, 普通计算机的完成时间是"instant", 你这个根本不用考虑算法.
|
19
realpg 2016-05-05 13:46:32 +08:00
十万个,又不是十万亿个,直接任何暴力算法对于计算机来说都不是问题
|
20
tvallday 2016-05-05 13:57:43 +08:00
Ruby solution:
num = gets.chomp res = [] # index array for number zero num.scan(/0/) do |c| key = c[0].to_i value = Regexp.last_match.offset(0)[0] res << value end result = res.flat_map {|e| [e-1, e, e+1]}.select {|e| e >= 0}.uniq result.pop if result.last == num.size p (result - res).inspect # index array for end result |
21
zingl 2016-05-05 14:58:27 +08:00
难道不是遍历一遍判断一下当前元素是否为 0 、前一个元素是否为 0 、确定是否记录位置就可以了,有那么复杂?
|
22
SmiteChow 2016-05-06 15:27:01 +08:00
楼主想复杂了
|