问题描述
小C在学习二进制运算,他了解到每个非负整数都有其二进制表示。例如,整数 5 可以被表示为二进制 "101",整数 11 可以被表示为二进制 "1011",并且除了 N = 0 外,任何二进制表示中都不含前导零。
二进制的反码表示是将每个 1 变为 0,每个 0 变为 1。例如,二进制数 "101" 的二进制反码为 "010"。现在小C想知道,给定一个十进制数 N,它的二进制反码对应的十进制数是多少。
测试样例
样例1:
输入:
N = 5输出:2
样例2:
输入:
N = 10输出:5
样例3:
输入:
N = 0输出:1
解题思路
拿到这道题的时候,其实心里已经做过很多遍,毕竟真的很常见,取二进制,取反,再转成十进制。
拆解出来:
- 题目要求我们计算一个非负整数
N的二进制反码对应的十进制数。 - 二进制反码的定义是将二进制表示中的每个
1变为0,每个0变为1。
从数据结构的选择方面:
- 我们需要将整数
N转换为二进制字符串。 - 然后对二进制字符串的每一位进行取反操作。
- 最后将取反后的二进制字符串转换回整数。
具体的算法步骤:
我想起来java有个方法是恶意将整数转成二进制字符串来着
- 使用
Integer.toBinaryString(N)方法将整数N转换为二进制字符串。 - 遍历二进制字符串的每一位,将
0变为1,将1变为0,并存储在新的字符串中。 - 使用
Integer.parseInt(reversedBinary.toString(), 2)方法将取反后的二进制字符串转换回整数。
代码
public class Main {
public static int solution(int N) {
// 将整数 N 转换为二进制字符串
String binaryString = Integer.toBinaryString(N);
// 将二进制字符串的每一位取反
StringBuilder reversedBinary = new StringBuilder();
for (char c : binaryString.toCharArray()) {
// 如果当前字符是 '0',则变为 '1',否则变为 '0'
if (c == '0') {
reversedBinary.append('1');
} else {
reversedBinary.append('0');
}
}
// 将取反后的二进制字符串转换回整数
return Integer.parseInt(reversedBinary.toString(), 2);
}
public static void main(String[] args) {
System.out.println(solution(5) == 2 ? 1 : 0);
System.out.println(solution(10) == 5 ? 1 : 0);
System.out.println(solution(0) == 1 ? 1 : 0);
}
}
关键的地方就是将整数 N 转换为二进制字符串:使用 Integer.toBinaryString(N)。将二进制字符串的每一位取反:遍历字符串,将 0 变为 1,将 1 变为 0。将取反后的二进制字符串转换回整数:使用 Integer.parseInt(reversedBinary.toString(), 2)。
个人的感悟与思考
时间复杂度
-
将整数
N转换为二进制字符串:使用
Integer.toBinaryString(N)方法的时间复杂度是O(log N),因为二进制字符串的长度是log N位。 -
遍历二进制字符串并取反:
遍历二进制字符串的时间复杂度是
O(log N),因为我们需要遍历每一位。 -
将取反后的二进制字符串转换回整数:使用
Integer.parseInt(reversedBinary.toString(), 2)方法的时间复杂度是O(log N),因为我们需要解析log N位的字符串。
空间复杂度
-
存储二进制字符串:
存储
N的二进制表示需要O(log N)的空间。 -
存储取反后的二进制字符串:
存储取反后的二进制字符串也需要
O(log N)的空间。
所以总的来讲时间复杂度和空间复杂度都是要O(log N)来处理。
碎碎念
通过这个练习,我不仅提升了自己的编程技能,还学到了一些关于二进制运算和字符串处理的知识。我深刻体会到,编程不仅仅是写代码,更重要的是理解问题、设计算法、编写代码以及测试和调试。每一个环节都需要认真对待,只有这样,才能写出高质量的代码。
比如在设计好算法后,我开始编写代码,我使用了 Integer.toBinaryString(N) 方法将整数转换为二进制字符串,使用 StringBuilder 来存储取反后的二进制字符串,并使用 Integer.parseInt(reversedBinary.toString(), 2) 方法将取反后的二进制字符串转换回整数。编写代码的过程中,我注意到了代码的可读性和简洁性,尽量使代码易于理解和维护。
编程是一个不断学习和成长的过程,只有不断地练习和挑战自己,才能不断提升自己的水平。
在未来的学习和工作中,我会继续保持这种积极的态度,不断挑战自己,提升自己的能力。