资讯专栏INFORMATION COLUMN

每日一题:一 石头 ----- 这里注重算法和效率

frolc / 1615人阅读

摘要:比较无聊的一天,小明决定列举了一大堆石头。他先数了数石头,发现堆里有几块石头,然后到商店去买标签。每一个标签都是从到的数字,每一个石头都应该分配一个唯一的数字,从到。所以我们要改进一下算法。

比较无聊的一天,小明决定列举了一大堆石头。他先数了数石头,发现堆里有几块石头,然后到商店去买标签。每一个标签都是从0到9的数字,每一个石头都应该分配一个唯一的数字,从1到N。如果每个标签的成本是1美元,小明会花多少钱在这个项目上?

</>复制代码

  1. function rocks(int $n): int {
  2. return ;
  3. }

其中:

$n为石头数,且$n为大于1的正整数
返回为需要的成本
例子:

</>复制代码

  1. 小明发现了13块石头:
  2. 则石头上的数字为:
  3. 1,2,3,4,5,6,7,8,9,10,11,12,13
  4. 所需要的标签为:
  5. 1,2,3,4,5,6,7,8,9,1,0,1,1,1,2,1,3
  6. 所需要的成本为:
  7. 17

这道题对于我们来讲,很多人的固定思路就是以下这种

</>复制代码

  1. function rocks(a) {
  2. var str = "";
  3. for(var i=1; i<=a; i++){
  4. str += i;
  5. }
  6. return str.length;
  7. }
  8. rocks(13);

通过求长度的方式来解决这类问题,但是如果说数据量一大,就会造成溢出。所以我们要改进一下算法。
以下是我对这道题的理解:
通过题意得知,如果是1位数的,就是1张标签,如果是两位数的就是两个标签,如果是三位数的就是三个标签。
我们只需要循环他所传递的长度的次数就可以了,通过,等差数列的方式,求出次数,
比如:
1位数: 10-1 * 1
2位数: 1010 - 101 * 2
3位数: 101010 - 10 10 2
以下是我的代码:

</>复制代码

  1. function rocks(int $n): int {
  2. // 得到长度.
  3. $length = strlen($n);
  4. $count = 0;
  5. if($length > 1){
  6. // 循环长度-1次. 这里求的是位数
  7. for($i=1;$i<$length;++$i){
  8. $count += $i * (pow(10,$i)-pow(10,$i-1));
  9. }
  10. // 如果到了 最后一次即到了 10的i次方 直接用n来减去即可
  11. $count += ($n - pow(10,$i-1) + 1)*$i;
  12. return $count;
  13. }else{
  14. return $n;
  15. }
  16. }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67318.html

相关文章

  • 每日: 石头 ----- 这里注重算法效率

    摘要:比较无聊的一天,小明决定列举了一大堆石头。他先数了数石头,发现堆里有几块石头,然后到商店去买标签。每一个标签都是从到的数字,每一个石头都应该分配一个唯一的数字,从到。所以我们要改进一下算法。 比较无聊的一天,小明决定列举了一大堆石头。他先数了数石头,发现堆里有几块石头,然后到商店去买标签。每一个标签都是从0到9的数字,每一个石头都应该分配一个唯一的数字,从1到N。如果每个标签的成本是1...

    tigerZH 评论0 收藏0
  • 每日: 石头 ----- 这里注重算法效率

    摘要:比较无聊的一天,小明决定列举了一大堆石头。他先数了数石头,发现堆里有几块石头,然后到商店去买标签。每一个标签都是从到的数字,每一个石头都应该分配一个唯一的数字,从到。所以我们要改进一下算法。 比较无聊的一天,小明决定列举了一大堆石头。他先数了数石头,发现堆里有几块石头,然后到商店去买标签。每一个标签都是从0到9的数字,每一个石头都应该分配一个唯一的数字,从1到N。如果每个标签的成本是1...

    wind3110991 评论0 收藏0
  • 每日: 石头 ----- 这里注重算法效率

    摘要:比较无聊的一天,小明决定列举了一大堆石头。他先数了数石头,发现堆里有几块石头,然后到商店去买标签。每一个标签都是从到的数字,每一个石头都应该分配一个唯一的数字,从到。所以我们要改进一下算法。 比较无聊的一天,小明决定列举了一大堆石头。他先数了数石头,发现堆里有几块石头,然后到商店去买标签。每一个标签都是从0到9的数字,每一个石头都应该分配一个唯一的数字,从1到N。如果每个标签的成本是1...

    sorra 评论0 收藏0
  • JS每日:Vue中的diff算法

    摘要:,文本节点的比较,需要修改,则会调用。,新节点没有子节点,老节点有子节点,直接删除老节点。所以一句话,的作用主要是为了高效的更新虚拟。 20190125 Vue中的diff算法? 概念: diff算法是一种优化手段,将前后两个模块进行差异对比,修补(更新)差异的过程叫做patch(打补丁) 为什么vue,react这些框架中都会有diff算法呢? 我们都知道渲染真实dom的开销是很大的...

    Caicloud 评论0 收藏0
  • 小李飞刀:做题第九弹!

    摘要:不过可能还没有抓到动态规划的真谛,总觉得哪里需要再校正下思路。这题也是动态规划的题目,目标总是要分解为子问题。总结看算法图解的时候,涉及动态规划的小结中有这样的每种动态规划解决方案都涉及网格。 写在前面的话 感觉做题越多遇到的写法越多,有种跃跃欲试的感觉~ 认真做题 第一题 70. 爬楼梯难度:简单假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少...

    Bamboy 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<