算法刷题:LC初级算法(三)

文章目录


整数反转

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。

作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnx13t/
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

这,老老实实做不就好了吗?

int reverse(int x) {
        int rev = 0;
        while (x != 0) {
            int pop = x % 10;
            x /= 10;
            if (rev > INT_MAX/10 || (rev == INT_MAX / 10 && pop > 7)) return 0;
            if (rev < INT_MIN/10 || (rev == INT_MIN / 10 && pop < -8)) return 0;
            rev = rev * 10 + pop;
        }
        return rev;
    }

字符串中的第一个唯一字符

给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。

思路:先读取字符串存入哈希表中,再遍历字符串看看哪个字符出现的最早。

int firstUniqChar(string s) {
        unordered_map<char,int> umci;
        for(char c:s){
            umci[c]+=1;
        }
        for(int i = 0;i<s.size();i++){
            if(umci[s[i]] == 1)
                return i;
        }
        return -1;
    }

有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

示例 1:

输入: s = "anagram", t = "nagaram"
输出: true

示例 2:

输入: s = "rat", t = "car"
输出: false

说明:
你可以假设字符串只包含小写字母。

作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xn96us/
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

思路:用哈希表还是有点麻烦,还是直接vector上吧。

bool isAnagram(string s, string t) {
        vector<int> a(26);
        for(char c:s)
            a[c-97]+=1;
        
        for(char c:t)
            a[c-97]-=1;
        
        for(int x:a)
            if(x!=0)
                return false;
        
        return true;
    }

验证回文串

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

示例 1:

输入: "A man, a plan, a canal: Panama"
输出: true

示例 2:

输入: "race a car"
输出: false

作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xne8id/
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

思路很直接,双指针没什么好说的。
回头全部写完会去跟别人的解法对比一下。

bool isPalindrome(string s) {
        int sz = s.size();
        for(int i = 0;i<sz;i++,sz--){
            while(s[i]<48 || (s[i]>58 && s[i]<65) || (s[i]>90 && s[i]<97) || s[i]<122){
                i++;
            }
            while(s[sz]<48 || (s[sz]>58 && s[sz]<65) || (s[sz]>90 && s[sz]<97) || s[sz]<122){
                sz--;
            }
            if(i<sz){
                if(s[i]!=s[sz])
                    return false;
            }
        }
        return true;
    }

给定一个正整数 n ,输出外观数列的第 n 项。

「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。

你可以将其视作是由递归公式定义的数字字符串序列:

countAndSay(1) = "1"
countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一个数字字符串。

前五项如下:

1.     1
2.     11
3.     21
4.     1211
5.     111221
第一项是数字 1 
描述前一项,这个数是 1 即 “ 一 个 1 ”,记作 "11"
描述前一项,这个数是 11 即 “ 二 个 1 ” ,记作 "21"
描述前一项,这个数是 21 即 “ 一 个 2 + 一 个 1 ” ,记作 "1211"
描述前一项,这个数是 1211 即 “ 一 个 1 + 一 个 2 + 二 个 1 ” ,记作 "111221"

作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnpvdm/
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

思路:
从“1”开始往上叠加。

string countAndSay(int n) {
        string s = '1'
        char flag = s[0];
        int count = 0;
        string temp;
        for(int i = 0;i<s.size();i++){
            if(s[i] == flag)
                count++;
            else{
                temp.append(itoa(count))
                flag = s[i];
                count = 0;

            }
        }
    }

最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 “”。

示例 1:

输入:strs = ["flower","flow","flight"]
输出:"fl"

示例 2:

输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。

作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnmav1/
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

思路:先按照字符串长度进行排序,之后对排过序的字符串取最长公共前缀子串。

static bool compare(const string &a, const string &b){
        return a.size()<b.size();
    }
    string longestCommonPrefix(vector<string>& strs) {
        sort(strs.begin(), strs.end(),compare);
        if(strs.size()==0 || strs[0].size()==0 ){
            return "";
        }
        for(int i=0;i<strs[0].size();i++){
            for(int j=1;j<strs.size();j++){
                if(strs[j][i]!=strs[j-1][i]){
                    return strs[0].substr(0,i);
                }
            }
        }
        return strs[0];
    }
上一篇:算法刷题:LC初级算法(二)


下一篇:算法刷题:LC初级算法(一)