首先,通过简单的课程教学和刷题训练,我对编程有了一定的了解。因此选择了一些简单的题目和大家分享一下。
这道题目书记了几个关键编程和数学知识点,大概有负数进制表示、模运算和整除、列表和字符串操作、函数封装等。
题目分析
本题要求将给定的整数 n 转换为负二进制形式的字符串。负二进制与传统二进制的区别在于其基数为 -2而非通常的2,数位权值按照(-2)^i 计算。需要注意的是,除结果为 “0” 外,返回字符串不能有前导零。
解决思路
我们可以通过不断地对 n 进行除以 -2 的运算来获取每一位的数字。在这个过程中,需要处理余数可能为负数的特殊情况。当余数为负时,需要将余数调整为正数(通过加上 2),同时要对商进行相应的调整(加 1),以符合负二进制的运算规则。然后将得到的余数从低位到高位依次构建成字符串。
以下是我编写的代码实现:
def adjust_remainder(remainder: int, n: int) -> (int, int):
# 如果余数为负数,调整余数和商
if remainder < 0:
remainder += 2
n += 1
return remainder,
def solution(n: int) -> str:
if n == 0:
return "0"
result = []
while n != 0:
remainder = n % -2
n = n // -2
# 调整余数和商
remainder, n = adjust_remainder(remainder, n)
# 将当前位的值添加到结果列表
result.append(str(remainder))
# 反转结果列表并拼接成字符串
return ''.join(result[::-1])
if __name__ == '__main__':
# 添加更多的测试用例
print(solution(n=2) == '110')
print(solution(n=3) == '111')
print(solution(n=0) == '0')
print(solution(n=-1) == '11') # 添加负数测试用例
print(solution(n=10) == '11110') # 添加较大正数测试用例
print(solution(n=-10) == '11010') # 添加较大负数测试用例
思路分析
-
处理负余数: -在负二进制转换中,余数可能会是负数。你需要确保余数始终为非负数,并且调整商(
n)以保持正确性。 -
反转结果列表: -由于我们是从低位到高位计算每一位的值,最后需要将结果列表反转,以得到正确的负二进制表示。
-
特殊情况处理: -当输入为
0时,直接返回0
def adjust_remainder(remainder: int, n: int) -> (int, int):
if remainder < 0:
remainder += 2
n += 1
return remainder, n
def solution(n: int) -> str:
if n == 0:
return "0"
result = []
while n != 0:
remainder = n % -2
n = n // -2
remainder, n = adjust_remainder(remainder, n)
result.append(str(remainder))
return ''.join(result[::-1])
if __name__ == '__main__':
# 正数测试用例
print(solution(n=2) == '110')
print(solution(n=3) == '111')
print(solution(n=10) == '11110')
# 负数测试用例
print(solution(n=-1) == '11')
print(solution(n=-10) == '11010')
# 零测试用例
print(solution(n=0) == '0')
知识总结
1.进制转换基础:本题涉及到非标准的进制转换知识。一般的进制转换思路(如十进制转二进制)是通过不断除以目标进制数取余数来实现,但负二进制由于基数为负,需要额外处理余数为负的情况。
2.数学运算规则:理解除法和取模运算在负整数情况下的表现。同时,要掌握在负二进制中对负数余数的调整规则,这是基于负进制数的数学原理,即保证计算结果符合 的数位权值计算方式。 学习心得
1.深入理解数学概念与编程的结合:这个问题让我深刻体会到数学概念在编程中的应用。看似简单的进制转换,在引入负进制后变得复杂,需要准确地将数学规则转化为代码逻辑。这使我明白在解决编程问题时,对相关数学知识的深入理解是非常关键的。
2.特殊情况处理的重要性:像处理余数为负以及前导零的问题,在编程中是很容易被忽略但又非常重要的细节。这提醒我在编写代码时要充分考虑各种可能的边界情况,确保程序的正确性和稳定性。通过对这些特殊情况的处理,也让我对问题的理解更加全面。
3.代码优化和简洁性的思考:在实现功能的基础上,可以进一步思考代码是否可以更简洁、更高效。虽然当前的代码已经能够正确地解决问题,但也许还有其他更优的算法或者数据结构可以用来改进这个函数,这也是在编程学习中持续追求的目标之一。