重新排序得到 2 的幂
难度:
标签:
题目描述
代码结果
运行时间: 27 ms, 内存: 16.0 MB
/*
* 思路:
* 1. 首先我们需要生成2的幂的所有可能值,这些值应该在给定范围内(1 <= n <= 10^9)。
* 2. 然后将每个2的幂转换为字符串并排序。
* 3. 将给定的数字n转换为字符串并排序。
* 4. 使用Java Stream API检查排序后的字符串是否与任何2的幂的排序字符串匹配。
*/
import java.util.stream.*;
public class Solution {
public boolean reorderedPowerOf2(int n) {
// 生成2的幂的排序字符串
List<String> powerOf2Strings = IntStream.iterate(1, i -> i <= 1e9, i -> i * 2)
.mapToObj(i -> {
char[] chars = String.valueOf(i).toCharArray();
Arrays.sort(chars);
return new String(chars);
}).collect(Collectors.toList());
// 将n转换为排序字符串
char[] nChars = String.valueOf(n).toCharArray();
Arrays.sort(nChars);
String sortedN = new String(nChars);
// 检查是否匹配任何2的幂
return powerOf2Strings.stream().anyMatch(s -> s.equals(sortedN));
}
}
解释
方法:
该题解的思路是将给定的整数 n 转换为字符串,并对其字符进行排序。然后生成从 2^0 到 2^30 的所有 2 的幂,并对每个幂的字符进行排序。最后,检查排序后的 n 的字符是否与任何排序后的 2 的幂的字符相匹配。如果匹配,则返回 True,否则返回 False。
时间复杂度:
O(m log m),其中 m 是整数 n 的位数。
空间复杂度:
O(1)
代码细节讲解
🦆
为什么选择2^0到2^30的范围生成2的幂?这个范围是否覆盖了所有可能的n值?
▷🦆
在比较排序后的字符时,是否考虑了由于数字重复导致的多种排列的情况?
▷🦆
为什么在这个算法中,使用字符串排序而不是其他方法来判断能否重新排列成2的幂?
▷🦆
该算法在处理数字中包含前导零的情况时是如何处理的?例如输入为100。
▷