【问题标题】:String padding and slicing to fixed length字符串填充和切片到固定长度
【发布时间】:2016-01-31 13:07:03
【问题描述】:

对于一些只有 1 和 0 的随机长度数组,我需要使其开始和结束始终分别为 001 和 100。

为了便于阅读,一些字符串形式的例子

"11010" => "00110100"
"01010" => "0010100"
"10000" => "00100"
"01100" => "001100"
"11111" => "001111100"
"00100" => "00100"
"00010" => "00100"
"00000" => ""    # cases with no 1's are ignored

我想出的代码只是 shift/unshift push/pops 使用 until

def norm(arr)
  (arr.index(1) > 2 ? arr.shift : arr.unshift(0)) until arr.index(1) == 2
  (arr.rindex(1) > arr.length-3 ? arr.push(0) : arr.pop) until arr.rindex(1) == arr.length-3
  arr
end

有没有更好(有点?)的方法来处理填充、切片等?

【问题讨论】:

  • 我建议在选择答案之前等待超过 27 分钟。通常,最好的答案需要一段时间来研究和开发。
  • 你不觉得选择答案有点早吗?我正在修改我的,@theTinMan 刚刚发布了一个,其他人很可能也在寻找答案。
  • 不清楚“只有 1 和 0 的数组”是什么意思,但随后显示字符串。您的代码也暗示您传入数组,但差异令人困惑。请编辑您的问题,说明这一点。
  • 我应该将示例格式化为数组吗? [1,1,0,0,1,0] => [0,0,1,1,0,0,1,0,0]会比110010 => 001100100更清楚
  • 您必须不在中途大幅更改您的问题,因为这会使 cmets 和答案变得令人费解且毫无意义,甚至可能导致完美的答案被否决。此外,由于整数001 与1 相同,因此切换到“整数”会变得更糟,这使问题变得无稽之谈。您应该编辑并将您的问题“回滚”到字符串。是的,您是 SO 新手,但您不认为在发布问题之前应该进行一些调查吗? Here 是一个开始的地方。

标签: arrays ruby string padding slice


【解决方案1】:

您可以忽略第一个1 之前和最后一个1 之后的任何0。所以,

def norm(arr)
  if arr.include?('1')
    ['0', '0'] + arr.slice(arr.index('1')..arr.rindex('1')) + ['0', '0']
  else
    []
  end
end

【讨论】:

    【解决方案2】:

    与其尝试做任何复杂的事情,我会这样做:

    [
      "11010", # => "00110100"
      "01010", # => "0010100"
      "10000", # => "00100"
      "01100", # => "001100"
      "11111", # => "001111100"
      "00100", # => "00100"
      "00010", # => "00100"
      "00000", # => ""    # cases with no 1's are ignored
    ].each do |s|
      if s['1']
        s[/^0*1/] = '001'
        s[/10*$/] = '100'
      end
      puts s
    end
    

    运行结果:

    # >> 00110100
    # >> 0010100
    # >> 00100
    # >> 001100
    # >> 001111100
    # >> 00100
    # >> 00100
    # >> 00000
    

    首先检查字符串是否包含1。如果是这样,代码会将任意数量的前导 0s 和 1 替换为 001,然后将尾随 1 后跟任意数量的 0s 替换为 100。

    【讨论】:

    • 正则表达式会比基于索引和 rindex 的切片更快吗?
    • 锚定正则表达式非常快。编写一些基准和测试。
    • 这是有道理的。我稍后会测试它。
    • 哦。这些以数组形式作为整数开始。我只是使用字符串来提高可读性。已编辑的问题。
    • 提供最少、准确的输入数据非常重要。你可以说你不这样做造成了混乱。
    【解决方案3】:

    您可以将String#gsub 与正则表达式一起使用:

    r = /
        \A0*   # match beginning of the string followed by zero or more zeroes
        (?=1)  # match 1 in a positive lookahead
        |      # or
        (?<=1) # match 1 in a positive lookbehind
        0*\z   # match zero of more zero's followed by the end of string
        /x     # regex "extended" or "free spacing" mode 
    
    arr = %w| 11010 01010 10000 01100 11111 00100 00010 00000 |
      #=> ["11010", "01010", "10000", "01100", "11111", "00100", "00010", "00000"] 
    
    arr.each { |s| puts "#{s} -> #{ s.gsub(r,'00') }" }
    # 11010 -> 00110100
    # 01010 -> 0010100
    # 10000 -> 00100
    # 01100 -> 001100
    # 11111 -> 001111100
    # 00100 -> 00100
    # 00010 -> 00100
    # 00000 -> 00000
    

    【讨论】:

      猜你喜欢
      • 2012-12-15
      • 2023-03-15
      • 2012-11-08
      • 1970-01-01
      • 2021-11-30
      • 2013-12-17
      • 2017-08-23
      • 2012-06-14
      相关资源
      最近更新 更多