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 验证回文字符串
思路是先去掉非字母数字的字符,再反转字符串看看和原来的相不相等。
# @param {String} s
# @return {Boolean}
def is_palindrome(s)
s.downcase!
s.gsub! /[^a-z0-9]/,''
return s.reverse == s
end
37 字符串转整数 atoi
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的运算,然后把结果和当前要进行计算的数字进行比较,从而判断经过计算后是否会溢出。溢出只能在计算前判断。