刷LeetCode题目一周,主要采用C++和Python编程手段,截至目前做了5道简单的leetcode题目,做下阶段性的小结:
小结主要通过手撕代码,复习加回顾,尽量避免自己眼高手低的情况发生,对于自己还不熟悉的内容,再次标注出来吗,以下是手撕代码的记录:
Python实现:
第二遍编程中出现的问题和不熟的地方,都已标注出来,着重复习,
1 class Solution: 2 """ 3 注意: 4 1. Python预研在处理负数时,最好将其转换成正数,然后最后把结果乘-1 5 2. 学到了一种赋值+判断的写代码方式 6 """ 7 def ReverseNum(self,num:int)->int: 8 rev = 0; 9 temp:int = num if num>0 else -num 10 while (temp): 11 pop = temp%10 12 rev = rev*10 + pop 13 temp = temp//10 14 15 INT_MAX = pow(2,31)-1 16 INT_MIN = pow(2,31)*(-1) 17 18 if num > 0: 19 if rev > INT_MAX: 20 return 0 21 else: 22 if (-rev) < INT_MIN: 23 return 0 24 return rev if num>0 else -rev 25 26 """ 27 注意: 28 无 29 """ 30 def isPalindrome(self,num:int)->bool: 31 if num < 0: 32 return False 33 rev = 0 34 temp = num 35 INT_MAX = pow(2,31)-1 36 while(temp): 37 pop = temp%10 38 rev = rev*10 + pop 39 temp = temp//10 40 41 if (rev != num): 42 return False 43 return True 44 45 """ 46 注意: 47 1. 当长度为1的时候,for循环中的算法将不起作用 48 2. python的字符串没有最后的' ',因此一定要考虑最后一个越界的影响 49 """ 50 def romanToNum(self,strs)->int: 51 table = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'m':1000} 52 53 if (len(strs) == 1): 54 return table[strs[0]] 55 rev = 0 56 for i in range(len(strs)-1): 57 if table[strs[i]] < table[strs[i+1]]: 58 rev -= table[strs[i]] 59 else: 60 rev += table[strs[i]] 61 return (rev + table[strs[i+1]]) 62 63 """ 64 注意: 65 当输入为空列表时,需要第一个if判断 66 当输入列表含有空字串时,则需要return时判断i的值是否大于0 67 """ 68 def longestCommonPrefix(self, strs)->str: 69 if len(strs)==0: 70 return "" 71 72 for i in range(len(strs[0])): 73 for j in range(1,len(strs)): 74 if i>=len(strs[j]) or strs[0][i] != strs[j][i]: 75 return strs[0][0:i] if i>0 else "" 76 return strs[0]
C++实现
1 class Solution{ 2 public: 3 int ReverseNum(int num); 4 bool isPalindrome(int num); 5 int RomanToNum(string RomanStr); 6 string longestCommonPrefix(vector<string> &strs); 7 }; 8 9 int Solution::ReverseNum(int num) 10 { 11 long long rev = 0; 12 int temp = num; 13 while(temp) 14 { 15 int pop = temp%10; 16 rev = rev*10 + pop; 17 temp = temp/10; 18 if(rev < INT_MIN || rev > INT_MAX) 19 { 20 return 0; 21 } 22 } 23 return rev; 24 }; 25 26 27 /* 28 注意: 29 1. 数据在发生反转的时候,一定要考虑溢出的情况,C++中可以采用更宽字节类型的变量来暂存结果,python可能需要溢出 30 */ 31 bool Solution::isPalindrome(int num) 32 { 33 if (num < 0){ 34 return false; 35 } 36 long long rev = 0; 37 int temp = num; 38 while(temp) 39 { 40 int pop = temp%10; 41 rev = rev*10 + pop; 42 temp /= 10; 43 } 44 if (num != rev) 45 return false; 46 return true; 47 }; 48 49 50 /* 51 注意: 52 1. 再次重温了下map的使用方式 53 */ 54 int Solution::RomanToNum(string RomanStr) 55 { 56 int rev = 0; 57 if (RomanStr.empty()) 58 return 0; 59 map<char,int> table = { 60 {'I',1}, 61 {'V',5}, 62 {'X',10}, 63 {'L',50}, 64 {'C',100}, 65 {'D',500}, 66 {'M',1000} 67 }; 68 69 int length =RomanStr.size(); 70 for(int index=0; index<length; index++) 71 { 72 if(table[RomanStr[index]] < table[RomanStr[index+1]]) 73 { 74 rev += (-1) * table[RomanStr[index]]; 75 continue; 76 } 77 rev += table[RomanStr[index]]; 78 } 79 return rev; 80 }; 81 82 /* 83 注意: 84 1. vector的使用方法 85 2. substr的使用方法 86 3. C++中对于字串返回可以直接返回""",不像python要注意返回空字串和空列表的区别 87 */ 88 string Solution::longestCommonPrefix(vector<string> &strs) 89 { 90 if (strs.size()==0 || strs[0].size()==0) 91 { 92 return ""; 93 } 94 95 for(int i=0; i<strs[0].size(); i++) 96 { 97 for(int j=1; j<strs.size(); j++) 98 { 99 if (strs[0][i] != strs[j][i]){ 100 return strs[0].substr(0,i); 101 } 102 } 103 } 104 return strs[0]; 105 }