【问题标题】:Alphabet mapped to values: How to find actual words that add up to given value?字母映射到值:如何找到加起来等于给定值的实际单词?
【发布时间】:2012-07-18 07:14:40
【问题描述】:

我看到有人分享的 G+ 帖子:

If
  A B C D E F G H I J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z

Equals
  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

Then
  K + N + O + W + L + E + D + G + E = 96% 
  H + A + R + D + W + O + R + K     = 98%

But
  A + T + T + I + T + U + D + E     = 100%

为了它和它的乐趣,忽略了百分比技巧 剩下的话题留给 G+ cmets。

但我问自己:找到所有 给定单词列表(一组固定的 n 个单词)中的单词加起来为 100?

【问题讨论】:

  • 哦,我一直很喜欢上学。但 17 年后……这纯粹是出于好奇。 @wildplasser
  • @wildplasser 谷歌翻译是否有资格“做作业”? :-) 但我认为这不会带来好成绩。

标签: algorithm list word


【解决方案1】:

我认为直接的方法会很好 - 它是 O(n):

  1. 创建一个将每个字母与点值相关联的哈希表
  2. 遍历列表。对于每个单词,将与哈希表中的字母关联的数字的值相加。如果总和为 100,则打印该单词或以某种方式将其标记为已找到(添加到新列表或其他内容中)...

(您可能会争论 O(n) 我想,如果您说“单词”可以任意长;尽管如果单词列表是某种语言中的单词。如果你有 m 是一个单词中的最大字母数,那么算法是 O(nm)。不过,在某些时候你是将不得不“查看”每个字母和每个单词,所以我无法想象有更省时的算法。)

【讨论】:

  • 正如克里斯的回答,如果初始字符值的总和已经大于 100,您可以通过不循环整个单词来节省一些时间。(当然这不会提高效率一种大的感觉。)”(引用我的其他评论)
【解决方案2】:

here 讨论了类似的问题。但是,您的具体问题提出了一种更简单的方法。由于单词列表中的单词数是有限的,并且总是小于最长单词长度的字符排列数,因此最好这样处理:

假设我们有一个charToNum 函数,它将一个字符映射到相应的数字:

for each word in wordlist
  sum := 0
  for each character in word
    sum := sum + charToNum(character)
    if (sum > 100)
      break // Correct result no longer possible
  if (sum == 100)
    Add the word to the result set

【讨论】:

  • +1 如果初始字符值的总和已经大于 100,则通过不循环整个单词来节省一些时间。(当然,这不会提高大 O 意义上的效率。)
  • 感谢@MatthewAdams 和克里斯。正如这个例子和 break 语句一样,我会接受它并 +1 Matthew's。
猜你喜欢
  • 2020-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多