【问题标题】:Min number of operations最少操作次数
【发布时间】:2012-02-01 13:34:02
【问题描述】:

给定一个正整数 N,我们可以按任意顺序任意多次应用以下任何操作:

第一个操作:给定正整数N加1;如果 N 为 7,则经过该操作后 N 变为 8。如果 N 为 999,则经过该操作后,它变为 1000。

第二次操作:选择任何出现的任何数字并将其替换为另一个数字。 (475->479, 101 -> 111, 299 -> 199 等等)

第三次操作:在 N 的十进制表示左侧添加任意非零数字:47 -> 247、9999 -> 49999、2474 -> 72474 等等)。

求将 N 变为幸运数字所需的最小操作次数。(幸运数字是正整数,其十进制表示仅包含幸运数字 4 和 7。例如,数字 47、744、4 是幸运数字和5、17、467 不是。)

示例:

N=25,答案=2

N=46,答案=1

N=99,答案=2

我在 LUCKY NUMBER 上尝试各种问题时发现了这个问题。 我被这个问题困住了...... 请帮忙..

【问题讨论】:

  • 你有时间限制吗?
  • 有没有比仅仅替换数字更好的解决方案的例子?
  • 不完全是,但约束 N 为 1
  • 一个澄清是40被视为幸运数字?鉴于声明“幸运数字是正整数,其十进制表示仅包含幸运数字 4 和 7”,我认为它不是
  • 比如你有407,我们可以取0加1变成417然后把1换成4或7吗?或者我们只能取0一次,然后加1直到达到4?

标签: algorithm


【解决方案1】:

“给数字加 1”和“给数字添加任何非零的前导数字”是红鲱鱼。

最小操作数是 N 中的每个数字一个,这是非幸运的。您只需将每个非 4、非 7 数字更改为 4 或 7。

添加前导数字永远不会帮助您,因为没有必要让数字变长。添加 1 似乎 可能会有所帮助,但它只会做两件事:要么不进位(当您添加小于 9 的数字时),在这种情况下,直接替换可以做同样的事情东西,或者它带有(当你添加到 9 时),在这种情况下,它只是创建了一个或多个非幸运零,你现在必须通过数字替换来“修复”。

【讨论】:

  • 抱歉,请您详细说明一下“:要么它不进位(当你添加一个小于 9 的数字时),在这种情况下,直接替换可以做同样的事情,或者它进位(当您添加到 9),在这种情况下,它只是创建了一个或多个非幸运零,您现在必须通过数字替换来“修复”。”..或者您能否提供伪代码..我是新手,觉得有点难理解。谢谢!
  • @Jack 将 1 添加到 1 与将其替换为 2 相同。将 1 添加到 2 将其替换为 3。您甚至考虑的唯一数字 i> 加一等于九……但这最多只能“修复”一位数字(例如,39+1 = 40),而您只需直接替换它即可“修复”该数字。因此,使用加法永远不会为您节省操作。
  • 确实感谢 Borealid 先生,为我解除了疑惑……我现在很好地理解了你的概念……
  • @Borealid::我已经更新(编辑)了一点,我希望能澄清关于问题陈述的疑问。幸运数字也意味着,一个数字中的所有数字都是 4 或7.如果一个数字包含除此之外的数字,那么它不是一个幸运数字
  • 抱歉,最后一条评论是给 Melvin Protacio 的
【解决方案2】:

显然,根据规则,答案是位数减去 4 或 7 次出现的次数。因此,例如,N=25,您将每个数字替换为 4 或 7,一次只取一个。对于 46,您取 6 并将其替换为 4 或 7,因此答案为 1。

您可以尝试连续模 10 评估来检查数字是 4 还是 7

$x = the number
$y = 0; #number of non 4 or 7
while($x>0){
   if($x % 10 != 4 && $x % 10 != 7){
      $y++;
   }
   if($x % 10 == 0){
      $y +=4;
   }
   $x = floor($x/10);
}

显然 0 在进行某些编辑时是不可替换的

【讨论】:

    【解决方案3】:

    只有第二种情况很重要。只需取一个字符串并计算有多少位不等于 4 和 7

    【讨论】:

      【解决方案4】:

      只要考虑第二个操作............并找到不同于 4 和 7 的位数......这就是答案......不是吗......: )

      【讨论】:

        【解决方案5】:

        你可以试试贪心的解决办法:

        检查数字中的所有数字并计算有多少不是 4 或 7 从上面的操作中取数,看看是否有小数,如果只加 1 就会得到幸运一。

        从两者中取最小 - 这就是解决方案

        在 N 中添加前导数字有什么意义?这不会为您提供最佳解决方案。

        【讨论】:

          猜你喜欢
          • 2020-02-12
          • 1970-01-01
          • 2019-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-28
          • 1970-01-01
          相关资源
          最近更新 更多