ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-05-12 17:02:10  阅读:208  来源: 互联网

标签:LC int rev 力扣 算法 字符串 LeetCode string 刷题


文章目录


整数反转

给你一个 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,int,rev,力扣,算法,字符串,LeetCode,string,刷题
来源: https://blog.51cto.com/u_15197573/2771375

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有