易混淆数
难度:
标签:
题目描述
代码结果
运行时间: 20 ms, 内存: 16.7 MB
/*
* 题目思路:
* 易混淆数是指一个数旋转180度后可以得到另一个有效的数字,并且这个数字不同于原始数字。
* 只有数字0, 1, 6, 8, 9在旋转180度后仍然是有效的(0->0, 1->1, 6->9, 8->8, 9->6)。
* 我们需要检查给定的数字是否满足这个条件。
*/
import java.util.stream.IntStream;
public class ConfusingNumberStream {
public boolean isConfusingNumber(int N) {
int[] rotateDigits = {0, 1, -1, -1, -1, -1, 9, -1, 8, 6};
String original = String.valueOf(N);
String rotated = new StringBuilder(original)
.reverse()
.chars()
.map(ch -> rotateDigits[ch - '0'])
.collect(StringBuilder::new, StringBuilder::append, StringBuilder::append)
.toString();
return !rotated.equals(original);
}
}
解释
方法:
该题解的核心思路是检查一个数字翻转180度后是否仍然保持不变。首先,我们使用一个字典来定义哪些数字可以翻转,并且翻转后的结果是什么(例如,'6'变成'9','9'变成'6')。对于输入的数字n,我们首先将其转换为字符串,然后遍历每一个字符,使用字典查找翻转后的字符。如果某个字符在字典中没有对应的翻转结果,则直接返回False,表示这不是一个易混淆数。如果所有字符都能找到对应的翻转结果,我们将这些结果组成新的数字字符串,并判断翻转后的数字是否与原始数字不同。如果不同,则返回True;如果相同,则返回False。
时间复杂度:
O(d)
空间复杂度:
O(d)
代码细节讲解
🦆
为什么在确定一个数字是否为易混淆数时,要检查翻转后的数字是否与原数字不同?
▷🦆
在创建翻转字典时,为什么只包括了'0', '1', '6', '8', '9'这几个数字,其他数字如'2', '3', '4', '5', '7'为什么不包括?
▷🦆
代码中将翻转后的数字加到列表前部是用来实现什么功能?这里为什么不直接在遍历时构造翻转字符串而采用列表?
▷🦆
如果原数字包括前导零,翻转后的处理方式会有什么不同么?例如数字'010'翻转后应处理为多少?
▷