【问题标题】:How to sort a string based on the given characters order?如何根据给定的字符顺序对字符串进行排序?
【发布时间】:2015-04-18 14:26:10
【问题描述】:

我正在尝试解决这个问题:给定一个字符串,要求您根据其他字符串中的字符顺序对其进行排序:

例子:

> sort_string('foos', 'of')
=> 'oofs'

> sort_string('string', 'gnirts')
=> 'gnirts'

> sort_string('banana', 'abn')
=> 'aaabnn'

我尝试了以下实现:

def sort_string(f_string, s_string)
  sanitize(s_string)
  s_string.chars.each do |e|
    f_string.length.times do |n|
      if f_string[n] == e
        s_string[e], s_string[n] = s_string[n], s_string[e]
      end
    end
  end
end

private

def sanitize(string)
  string.chars.uniq.join
end

但它给了我以下错误:

4_AStringOfSorts.rb:6:in `[]=': 没有将 nil 隐式转换为 String (TypeError) 来自 4_AStringOfSorts.rb:6:in `sort_string 中的块(2 级)' 来自 4_AStringOfSorts.rb:4:in `times' 来自 4_AStringOfSorts.rb:4:in `block in sort_string' 来自 4_AStringOfSorts.rb:3:in `each' 来自 4_AStringOfSorts.rb:3:in `sort_string' 来自 4_AStringOfSorts.rb:18:in `'

【问题讨论】:

  • 我不懂规则。 sort_string('zaefc', 'fa') 是否返回 efcaz?这里'f' 和'a' 在31'zaefc' 的偏移量处。这两个字母是否要交换,但保留13 的位置,以及剩余的字符'z''e''c',是否按字典顺序排序,但保留在偏移量0、@ 987654335@ 和 4?
  • @Cary Swoveland, sort_string('zaefc', 'fa') => 'fazec'

标签: ruby string sorting


【解决方案1】:

注意事项:

  • 您的方法在 Ruby 中并不惯用(即使按照命令式标准,它也过于复杂)

  • sanitize(s_string):你没有捕捉到这个方法的结果,所以它什么也没做。

更惯用和实用的方法:

def sort_string(s, order)
  s.chars.sort_by { |c| order.index(c) || order.size }.join
end

【讨论】:

    【解决方案2】:

    类似的方法:

    def sort_string(s, order)
      order.chars.map { |c| c * s.count(c) }.join
    end
    

    【讨论】:

    • 如果s = 'zaefcf' and order = 'fa', this returns ffa`。我知道返回的字符串也包含剩余的字符。
    【解决方案3】:

    如果@tokland 对问题的解释是正确的,也可以这样做,而不用排序本身

    def sort_string(s, order)
      sa = s.chars
      order.each_char.with_object('') do |c,str|
        while (idx = sa.index(c))
          str << sa.delete_at(idx)
        end
      end + sa.join
    end
    
    sort_string('zaefcf', 'fa')
      #=>"ffazec"
    

    这是使用sort_by 的另一种方式,但仅限于需要排序的字符串部分:

    def sort_string(s, order)
      sa = s.chars
      e = sa - order.chars
      (sa - e).sort_by { |c| order.index(c) }.concat(e).join
    end
    
    sort_string('zaefcf', 'fa')
      #=> "ffazec" 
    

    【讨论】:

      猜你喜欢
      • 2023-01-21
      • 2016-11-03
      • 2021-03-27
      • 2021-12-20
      • 1970-01-01
      • 2012-03-16
      • 1970-01-01
      • 2021-11-09
      • 2019-03-31
      相关资源
      最近更新 更多