虽然都是很简单的算法,每个都只需5分钟左右,但写起来总会遇到不同的小问题,希望大家能跟我一起每天进步一点点。
更多的小算法练习,可以查看我的文章。

规则

Using the JavaScript language, have the function KaprekarsConstant(num) take the num parameter being passed which will be a 4-digit number with at least two distinct digits. Your program should perform the following routine on the number: Arrange the digits in descending order and in ascending order (adding zeroes to fit it to a 4-digit number), and subtract the smaller number from the bigger number. Then repeat the previous step. Performing this routine will always cause you to reach a fixed number: 6174. Then performing the routine on 6174 will always give you 6174 (7641 - 1467 = 6174). Your program should return the number of times this routine must be performed until 6174 is reached. For example: if num is 3524 your program should return 3 because of the following steps: (1) 5432 - 2345 = 3087, (2) 8730 - 0378 = 8352, (3) 8532 - 2358 = 6174.

使用JavaScript语言,让函数KaprekarsConstant(num)获取 传递的num参数,该参数将是一个4位数字,至少有两个不同的数字。
按降序和升序排列数字(添加零以使其适合4位数字),用较大的数字去较小的数字。
然后重复上一步,直到相减结果等于固定数字:6174,返回该程序必须执行的次数。
例如:如果传入的参数为3524,你的程序应该返回3,即该程序必须执行3次才能得到6174的结果。
因为以下步骤:(1)5432 - 2345 = 3087,(2)8730 - 0378 = 8352,(3)8532 - 2358 = 6174.

function KaprekarsConstant(num) { // code goes here  return num;
}// keep this function call here
KaprekarsConstant(3524);    

测试用例

Input:2111
Output:5Input:9831
Output:7

my code

function KaprekarsConstant(num) {var count = 0while (true) {var maxNum = num.toString().split('').sort((item1, item2) => item2 - item1).join('')maxNum = Number(maxNum)var minNum = num.toString().split('').sort().join('')minNum = Number(minNum)num = '0000' + (maxNum - minNum)num = num.substr(-4)count++if (num == 6174 || num == 0) break}return count
}

other code

code-1

function KaprekarsConstant(num) {const KAP = 6174;var count = 0;while (true) {var num = evaluator(num)if (num === true) {return count;}}function evaluator(num) {count++console.log('count', count);var minNumArr = num.toString().split('').sort();var maxNumArr = minNumArr.slice(0).reverse();var littleNum = parseInt(minNumArr.join(''), 10);var bigNum = parseInt(maxNumArr.join(''), 10);while (bigNum < 1000) {bigNum = bigNum * 10;}return bigNum - littleNum === KAP ? true : bigNum - littleNum;}
}

code-2

function KaprekarsConstant(num) {var count = 0;while (num != 6174) {count += 1;var numArr = num.toString().split('');while (d.length < 4) {numArr.push('0');}var smaller = numArr.sort().join('');var bigger = numArr.reverse().join('');num = bigger - smaller;}return count;
}

code-3

function KaprekarsConstant(num) { let count = 0;while (num != 6174) {let numArray = num.toString().split('').sort();let ascending = parseInt(numArray.join(''));let descending = parseInt(numArray.reverse().join(''));while (descending.toString().length < 4) {descending *= 10;}num = Math.abs(ascending - descending);count++;if (count > 999) break;  // failover}return count;
}

思路

个人思路:

  1. 本想使用递归去解决,代码量会更少更优雅,然后发现需要计算执行的次数,所以才使用while去遍历执行(其实使用闭包也可以解决,无奈题目调用就是KaprekarsConstant(xxxx)
  2. 先把数字转成字符串再转数组,使用数组升降排序拿到最大最小值,相减之后得到结果
  3. 给相减结果补0,保证相减结果一直都是4位数
  4. 当相减结果等于6174或0时,中断while循环,返回执行次数

优化点:
1.minArr = num.toString().split('').sort(); minNum = minArr.join(""),那么maxNum可以直接使用minArr.reverse().join('')得到
2.可以把if判断内容放到while上
3.补0可以使用 num * 10 的方式,而不是字符串补零

每日一道算法题 - KaprekarsConstant(hard-1)相关推荐

  1. 怎么判断一个字符串的最长回文子串是否在头尾_每日一道算法题,让你的头脑更活跃(寻找最长回文子串)...

    前言 最近准备把算法慢慢的捡起来,所以准备日更一道算法题目,难度自然是由简入难,所以同学们可以每天都来看看小编的更新. 日更时间定在每晚20:00,希望大家多多关注啦. 昨天就欠更了,简直就是打脸.过 ...

  2. 每日一道算法题--leetcode 509--斐波那契数(动态规划)--python

    [题目描述] [代码思路] 自底向上的动态规划,避免了采用递归浪费空间以及重复计算. [源代码] class Solution(object):def fib(self, N):"" ...

  3. 每日一道算法题 - LongestWord(easy-1)

    虽然都是很简单的算法,每个都只需5分钟左右,但写起来总会遇到不同的小问题,希望大家能跟我一起每天进步一点点. 更多的小算法练习,可以查看我的文章. 规则 Using the JavaScript la ...

  4. 每日一道算法题-寻找丑数

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 题目:我们把只包含因子2.3和5的数称 ...

  5. 每日一道算法题--leetcode 169--求众数--python--两种方法

    [题目描述] [求众数I] [算法思路] [方法一] 在不要求时间空间复杂度的情况下,可以采用的方法很多,最简单易懂的一种就是对nums中每个值统计一下数量,如果数量大于nums长度的一半,就直接返回 ...

  6. 每日一道算法题 拿金币(蓝桥杯练习系统)简单的dp算法

    资源限制 内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 有一个N x N的方格,每一个格子都有一些金币,只要站在格子里就 ...

  7. 每日一道算法题--leetcode 746--使用最小花费爬楼梯--python

    [题目描述] !!题干里的示例1需要仔细看一下哦,要到达顶层,即20那一层,可以跳过20这一层达到更高一层,也因此我们给cost数组最后加一个元素0,模拟最顶层的上一层无须花费力气. [代码思路] 最 ...

  8. 每日一道算法题--leetcode 179--最大数--python

    [题目描述] [代码思路] 第一反应是用冒泡排序,但是时间复杂度比较高,所以采用了python库函数简化代码.其实这道题就是要对比 int(str(nums[i])+str(nums[i+1])) 和 ...

  9. 每日一道算法题:高楼扔鸡蛋问题(动态规划问题)

    题目是这样:你面前有一栋从 1 到N共N层的楼,然后给你K个鸡蛋(K至少为 1).现在确定这栋楼存在楼层0 <= F <= N,在这层楼将鸡蛋扔下去,鸡蛋恰好没摔碎(高于F的楼层都会碎,低 ...

最新文章

  1. 【Python】深度学习中将数据按比例随机分成随机 训练集 和 测试集的python脚本
  2. 盘点几个开源的高仿项目,B站最像~
  3. CSMAR database query sample
  4. pytorch简单代码实现deep dream图(即CNN特征可视化 features visualization)
  5. 糟糕的C语言睡眠排序算法
  6. Luogu P1525 【关押罪犯】
  7. python做单元测试_如何使用python做单元测试?
  8. 高等数学(工本)填空题
  9. STM32固件库下载
  10. 【django】django面试题总结
  11. lowB三人组算法-冒泡排序-选择排序-插入排序
  12. oracle学习笔记(四)-- 数学函数
  13. Microsoft.Office.Interop.Excel # Microsoft Excel xx.0 Object Library 引用
  14. y=asin(wx+φ)的对称中心_函数y=Asin(wx+φ)的图像
  15. 成本低廉的深度学习与渲染显卡购买方案--英伟达矿卡P106
  16. 心紊妥布俅善市陀炎妇涣上街彻躺
  17. “bang” in JavaScript
  18. 有效的回旋镖(2022-6-8)每日一练
  19. Uniapp URL地址栏获取指定参数
  20. AIX各项知识链接(IBM官网)

热门文章

  1. MySQL性能半同步复制VS异步复制
  2. Linux系统通过Squid配置实现代理上网
  3. 利用 Zabbix 监控 mysqldump 定时备份数据库是否成功 | 运维进阶
  4. grafana和zabbix的端口映射
  5. java的反射机制--关于类中属性的反射。
  6. 树莓派zero_w 串口的使用(解决usb可用rxtx不可用的问题)
  7. sun.misc.BASE64Encoder找不到的解决方法
  8. 我可以获得标记为--assume-unchanged的文件列表吗?
  9. 有没有更好的写v =(v == 0?1:0)的方法; [关闭]
  10. 对服务与工厂感到困惑