算法(入门)_水仙花数&反转一个3位整数

水仙花数

水仙花数的定义:

一个 N 位非负整数,其各位数字的 N 次方和等于该数本身

栗子:

153 = 13^3 + 53^3 + 33^3

370 = 3^3 + 7^3 + 0^3

371 = 3^3 + 7^3 + 1^3

1634 = 14^4 + 64^4 + 34^4 + 44^4。

更详细的推荐:维基百科

描述:

给出n,找到所有的n位十进制水仙花数。

样例:

比如 n = 1, 所有水仙花数为:[0,1,2,3,4,5,6,7,8,9]

而对于 n = 2, 则没有 2 位的水仙花数,返回 []

题目分析:

弄懂水仙花数!

判断一个数是否为水仙花数:

要找出水仙花数,首先我们需要能识别一个数是否为水仙花数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 判断一个数是否为水仙花数
const isTrue = num => {
const n = num.toString().length; // 数的长度
const str = num.toString(); // 转字符 等下取数字
let total = 0; // 总数
for (let i = 0; i < n; i++) {
total += Math.pow(str.charAt(i), n); // 转字符串一个字符一个字符拿出来 计算其各位数字的N次方和
}
if (num === total) {
return true; // 最终相等 即为正确
} else {
return false;
}
};

找出所有的n位十进制水仙花数

  • 确定查找的范围(找出n位的最大值与最小值)
  • 遍历每个数,判断为水仙花数,添加到数组中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const getNarcissisticNumbers = n => {
let min = Math.pow(10, n - 1),
max = Math.pow(10, n),
arr = [];
if (n === 1) { // n == 1的时候,min应该等于0,但是min等于1,所以这边手动判断一下。
min = 0;
}
for (let j = min; j < max; j++) {
const str = j.toString(); // 转字符
let total = 0;
for (let i = 0; i < n; i++) {
// 判断一个数是否为水仙花数
total += Math.pow(str.charAt(i), n); // 转字符串一个字符一个字符拿出来 计算其各位数字的N次方和
}
if (j === total) {
arr.push(j);
}
}
return arr;
};

注意:

查找位数过大会出现性能问题,以及最大值溢出问题。


反转一个 3 位整数

描述:

反转一个只有 3 位数的整数

样例:

123 反转之后是 321。
900 反转之后是 9。

题目分析:

  • 009这种形式需要转为9
  • 最后输出的数字。

转数组操作:

这是最简单,最容易想到的答案:

  1. 数字转成字符串再转成数组
  2. 颠倒数组(翻转了),恢复成字符串
  3. 输出正常数字,这里用了+号。(用parseInt等也是可以的)
1
2
3
const reverseInteger = function(number) {
return +[...number.toString()].reverse().join('');
};

取余数,逐个颠倒

1
2
3
const reverseInteger = function (number) {
return parseInt(number%10)*100+parseInt((number%100)/10)*10+parseInt(number/100)*1
}

通过取余操作,个位转百位,十位转十位,百位转个位。

比如:123=>300+20+1,输出321

拼接字符串:

  • 数字转字符串
  • 从后往前取对应位置字符,拼接成一个颠倒的字符串
1
2
3
4
const reverseInteger = function(number) {
var str = number.toString(); // 转字符
return parseInt(str.charAt(2) + str.charAt(1) + str.charAt(0)); // 取对应位置字符,拼接成新的字符串
};
听说,打赏我的人最后都找到了真爱。