2

我试图弄清楚是否有一种方法可以拆分包含不同数字大小的数字的字符串,而不必使用 if/else 语句。是否有这样做的直接方法。这是一个示例字符串:

"123456789101112131415161718192021222324252627282930"

这样它将被拆分为包含 1-9 和 10-30 的数组,而不必先将数组拆分为单个数字,将其分开,找到 9,然后迭代组合 9 之后的每 2 个元素。

这是我要澄清的当前方式:

single_digits, double_digits = [], []
string = "123456789101112131415161718192021222324252627282930".split('')

single_digits << string.slice!(0,9)
single_digits.map! {|e| e.to_i}
string.each_slice(2) {|num| double_digits << num.join.to_i}

这会给我:

single_digits = [1,2,3,4,5,6,7,8,9]
double_digits = [10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30]
4

3 回答 3

1

只要你能确定每个数字都大于它的前一个数字并且大于零,并且从单个数字到最大值的每个数字长度至少表示一次,你就可以这样写

def split_numbers(str)
  numbers = []
  current = 0
  str.each_char do |ch|
    current = current * 10 + ch.to_i
    if numbers.empty? or current > numbers.last
      numbers << current
      current = 0
    end
  end
  numbers << current if current > 0
  numbers
end

p split_numbers('123456789101112131415161718192021222324252627282930')

输出

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]

对于 Anon 的例子,192837453572我们得到

[1, 9, 28, 37, 45, 357, 2]
于 2013-07-21T00:33:06.537 回答
0

遍历字符串的每个字符,收集单个“数字”,直到找到 9(设置控制值并将其增加 1),然后继续收集两位数字,直到找到 2 个连续的 9,然后继续。

然后可以编写它来处理任何数字序列,例如您的示例字符串。

于 2013-07-20T23:45:52.320 回答
0

你可以这样做:

str = "123456789101112131415161718192021222324252627282930"

result = str[0..8].split('').map {|e| e.to_i }
result += str[9..-1].scan(/../).map {|e| e.to_i }

它与您的解决方案基本相同,但更简洁(无需组合数字对)。但是,是的,如果您想要对任意长度的字符串(包括超过 2 位数字)的通用解决方案,那么这与您似乎在问的问题不同。

更新

好吧,我一直无法摆脱这个问题,因为似乎有一个简单、可推广的解决方案。所以这是我的尝试。基本思想是保留一个计数器,以便您知道要从字符串中切出的数字的位数。

str = "123456789101112131415161718192021222324252627282930"

result = []
i = 1
done = str.length < 1
str_copy = str

while !done do
  result << str_copy.slice!(0..i.to_s.size-1).to_i
  done = true if str_copy.size == 0
  i += 1
end

puts result

这会生成所需的输出,并且可以推广到从 1 开始的一串连续正整数。我很想看看其他人对此的改进——它不是超级简洁

于 2013-07-20T23:52:05.247 回答