[LeetCode][初级算法][字符串] 32-37

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的运算,然后把结果和当前要进行计算的数字进行比较,从而判断经过计算后是否会溢出。溢出只能在计算前判断。

猜你喜欢

转载自blog.csdn.net/lokira518/article/details/80328378
今日推荐