汉扬编程 C语言入门 LeetCode7.翻转整数-C语言与python的异同点

LeetCode7.翻转整数-C语言与python的异同点

首先,给出c语言和python同一语义的不同表达方式,然后再使用c语言和python分别解LeetCode题:LeetCode7.翻转整数。

C语言和Python中的整除“/”和取余“%”

c语言:7 / 4 = 1Python:7 // 4 = 1 //Python中 7 / 4 = 1.75 表示浮点数除法;双斜杠 //表示整数除法再看一下符号对整除是否有影响:

c语言: python: 7 / 4 = 1 7 // 4 = 1 -7 / 4 = -1 -7 // 4 = -27 / -4 = -1 7 // -4 = -2-7 / -4 = 1 -7 // -4 = 1可以看出,除数和被除数符号不同时,计算结果是不同的。

再看一下,取余C语言和python是否有区别:

c语言: python: 7 % 4 = 3 7 % 4 = 3 -7 % 4 = -3 -7 % 4 = 17 % -4 = -3 7 % -4 = -1-7 % -4 = -3 -7 % -4 = -3可以看出,除数和被除数符号不同时,计算结果是不同的。

结论:

当除数与被除数符号一致时,整除和 取余运算在c语言和python中所得结果是一样的;

当除数与被除数符号不一致时,注意调整python中符号。

整除时,除数和被除数符号不一致时,调整完除数的符号时,要根据结果看是否调整最后结果的符号;

取余时,除数和被除数符号不一致时,由于结果与除数符号相同,只需要调整除数符号即可。

C语言和Python中的“与或非”

C语言: 或 || 与&&if (ans > IntMax / 10 || (ans == IntMax / 10 && pop > IntMax % 10)) return 0;if (ans < IntMin / 10 || (ans == IntMin / 10 && pop < IntMin % 10)) return 0;Python: 或or 与andif ans > IntMax // 10 or (ans == IntMax // 10 and pop > IntMax % 10): return 0 if ans < -(IntMin // -10) or (ans == -(IntMin // -10) and pop < IntMax % -10): return 0C语言和Python中的32位最大整数

C语言:#define INTMAX ((unsigned)(-1)>>1)#define INTMIN (~INTMAX)Python://Python没有宏定义 IntMax = 2 ** 31 – 1//指数^用**表示 IntMin = -2 ** 31LeetCode7.整数翻转

给你一个 32 位的有符号整数 x ,返回 x 中每位上的数字反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。

示例 1:

输入:x = 123

输出:321

示例 2:

输入:x = -123

输出:-321

示例 3:

输入:x = 120

输出:21

示例 4:

输入:x = 0

输出:0

思路分析:

我们可以一次构建反转整数的一位数字。在这样做的时候,我们可以预先检查向原整数附加另一位数字是否会导致溢出。反转整数的方法可以与反转字符串进行类比。我们想重复“弹出” x 的最后一位数字,并将它“推入”到 ans 的后面。最后,ans 将与 x 相反。要在没有辅助堆栈 / 数组的帮助下 “弹出” 和 “推入” 数字,我们可以使用数学方法。

弹出:int pop = x % 10;x /= 10; 推入:ans = ans * 10 + pop;但是,这种方法很危险,因为当ans = ans * 10 + pop; 时会导致溢出。但是我们可以事先检查这个语句是否会导致溢出很容易。在代码ans = ans * 10 + pop;前边加入检查:

if ans > IntMax // 10 or (ans == IntMax // 10 and pop > IntMax % 10): return 0if ans < -(IntMin // -10) or (ans == -(IntMin // -10) and pop < IntMax % -10): return 0下边给出C语言和python 的完整代码:

c语言:

#include<stdio.h>#include<stdlib.h>#define INTMAX ((unsigned)(-1)>>1)#define INTMIN (~INTMAX)int reverse(int x){ int ans = 0; int IntMax = INTMAX; int IntMin = INTMIN; while (x != 0) { int pop = x % 10; x /= 10; if (ans > IntMax / 10 || (ans == IntMax / 10 && pop > IntMax % 10)) return 0; if (ans < IntMin / 10 || (ans == IntMin / 10 && pop < IntMin % 10)) return 0; ans = ans * 10 + pop; } return ans;}int main(){ int x = -2147483647; int ans = reverse(x); printf("%d\\n", ans); return 0;}Python:

class Solution: def reverse(self, x: int) -> int: ans = 0 IntMax = 2 ** 31 – 1 IntMin = -2 ** 31 while x != 0: if x > 0: pop = x % 10 x //= 10 else: pop = x % -10 x = -(x // -10) if ans > IntMax // 10 or (ans == IntMax // 10 and pop > IntMax % 10): return 0 if ans < -(IntMin // -10) or (ans == -(IntMin // -10) and pop < IntMax % -10): return 0 ans = ans * 10 + pop return ansif __name__ == "__main__": x = 123 test = Solution() ans = test.reverse(x) print(ans)leetcode2. 两数相加-c语言-python3

LeetCode4. 寻找两个正序数组的中位数

LeetCode5.0-最长回文子串-中心扩展法-C语言

LeetCode5.1-马拉车算法求解最长回文子串

LeetCode5.2-动态规划求解最长回文子串

本文来自网络,不代表汉扬编程立场,转载请注明出处:http://www.hyzlch.com/cjia/6860.html

上海语言类培训学校有那些

支付宝集五福正式开奖,3亿人分5亿元,最终分到的钱竟有些意外

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

返回顶部