32 反转字符串
没啥好说的:
char* reverseString(char* s) { int i=0; int len = strlen(s); int j = len-1; while(i<j){ s[i]=s[i]^s[j]; s[j]=s[i]^s[j]; s[i]=s[i]^s[j]; i++; j--; } return s; }
33 颠倒整数
给定一个 32 位有符号整数,将整数中的数字进行反转。
注意:
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。根据这个假设,如果反转后的整数溢出,则返回 0。
难点在于如何判断溢出。我们使用的方法是,用X10后的结果再/10,如果经过这一操作后,值已经和原来不同,则判断为溢出。
int reverse(int x) { int ans; int tmp; while(x!=0){ tmp=ans*10+x%10; x/=10; if(tmp/10 != ans) return 0; else ans = tmp; } return ans; }
34 字符串中第一个唯一字符
思路是记录26个字母出现的次数,并找出次数为1的那个。
int firstUniqChar(char* s) { int map[26]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; int len = strlen(s); int i = 0; while(i<len){ map[s[i] - 'a']++; i++; } i = 0; while(i<len){ if( map[s[i] - 'a']==1 ) return i; i++; } return -1; }
35 有效的字母异位词
还是用到map,第一遍加次数,第二遍减次数,同时如果遇到没有的字母则返回false。
最后遍历一次,如果还有剩余没减完次数的字母,则返回他。
# @param {String} s # @param {String} t # @return {Boolean} def is_anagram(s, t) map = {} s.each_char do |c| if !map[c] map[c] = 1; else map[c]+=1; end end t.each_char do |c| if !map[c] return false else map[c]-=1; end end map.each do |k,v| if v > 0 return false end end return true end
36 验证回文字符串
https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/5/strings/36/
思路是先去掉非字母数字的字符,再反转字符串看看和原来的相不相等。
# @param {String} s # @return {Boolean} def is_palindrome(s) s.downcase! s.gsub! /[^a-z0-9]/,'' return s.reverse == s end
37 字符串转整数 atoi
https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/5/strings/37/
int myAtoi(char* str) { char* ptr = str; int ans=0; int sign=1; while(*ptr==' '){ ptr++; //skip spaces } if(*ptr=='+'){ ptr++; } else if(*ptr=='-'){ sign = -1; ptr++; } while(*ptr >= '0'&& *ptr <= '9'){ int tmp = *ptr-'0'; if(sign==1&&(INT_MAX/10<ans || (INT_MAX/10==ans&&INT_MAX%10<=tmp))) //题目说不能用long long return INT_MAX; else if(sign==-1&&(-(INT_MIN/10)<ans || (-(INT_MIN/10)==ans&&-(INT_MIN%10)<=tmp))) return INT_MIN; ans = ans*10 + tmp; ptr++; } return ans*sign; }
这题先读取符号位,接下来如果是数字则读取并计算。
重点也是判断溢出,本题用到的方法是将INT_MAX和INT_MIN做除以10和取余10的运算,然后把结果和当前要进行计算的数字进行比较,从而判断经过计算后是否会溢出。溢出只能在计算前判断。