LeetCode 初级 字符串部分

整数反转

说明

  • 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
  • 示例
    • 示例 1:
      • 输入: 123
      • 输出: 321
    • 示例 2:
      • 输入: -123
      • 输出: -321
    • 示例 3:
      • 输入: 120
      • 输出: 21
  • 注意:
    • 假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

解答

  • 思路:
    • 循环预制为 !=0
    • res 的上下线要大于int才行(long)
    • res 每次乘上 10 + x%10;
    • 判断上下线
  • Code
    class Solution {
    public:
        int reverse(int x) {
            long res=0;
            while(x)
            {
                res=res*10+x%10;
                x/=10;
            }
            if(res>INT_MAX||res<INT_MIN) {return 0;}
            return res;
        }
    };
    

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

说明

  • 给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
  • 案例:
    • s = “leetcode”
    • 返回 0.
    • s = “loveleetcode”,
    • 返回 2.
  • 注意事项:您可以假定该字符串只包含小写字母。

  • 思路:
    • 将字符统计到unordered_map内
    • 然后循序访问第一个只存在一次的字符
  • Code
    class Solution {
    public:
        int firstUniqChar(string s) {
            unordered_map<char, int> m;
            for(auto &a:s) {m[a]++;}
            int idx = 0;
            for(; idx < s.size(); ++idx){
                if (m[s[idx]] == 1) return idx;
            }
            return -1;
        }
    };
    

有效的字母异位词

说明

  • 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
  • 示例
    • 示例 1:
      • 输入: s = “anagram”, t = “nagaram”
      • 输出: true
    • 示例 2:
      • 输入: s = “rat”, t = “car”
      • 输出: false
  • 说明:
    • 你可以假设字符串只包含小写字母。
  • 进阶:
    • 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

解答

  • 思路:
    • 新建一个map对原来的字符串进行统计
    • 一个字符串++, 另一个字符串–
    • 如果map中所有的key的值都是0,则为true
    class Solution {
    public:
        bool isAnagram(string s, string t) {
            if(s.size()!=t.size()){return false;}
            unordered_map<char, int> m;
            for(auto &a:s){m[a]++;}
            for(auto &a:t){m[a]--;}
            for(auto t:m){
                if (t.second != 0){
                    return false;
                }
            }
            return true;
        }
    };
    

验证回文字符串

说明

  • 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
  • 说明:本题中,我们将空字符串定义为有效的回文串。
  • 示例
    • 示例 1:
      • 输入: “A man, a plan, a canal: Panama”
      • 输出: true
    • 示例 2:
      • 输入: “race a car”
      • 输出: false

答案

  • 思路
    • 左右指针法
    • 不在给定区间的字符跳过
    • 如果左右指针的字符不等,则非回文字符串
    class Solution {
    public:
        bool isPalindrome(string s) {
            transform(s.begin(),s.end(),s.begin(),::tolower);
            int l =0, r=s.size()-1;
            while(l < r){
                if(!(('a' <= s[l] && s[l] <= 'z') || ('0' <= s[l] && s[l] <= '9'))) {l++; continue;}
                if(!(('a' <= s[r] && s[r] <= 'z') || ('0' <= s[r] && s[r] <= '9'))) {r--; continue;}
                if(s[l]!=s[r]){
                    return false;
                }
                ++l, --r;
            }
            return true;
        }
    };
    

请你来实现一个 atoi 函数,使其能将字符串转换成整数。

说明

  • 功能说明:
    • 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
    • 当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
    • 该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。
  • 注意:
    • 假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。
    • 在任何情况下,若函数不能进行有效的转换时,请返回 0。
  • 说明:
    • 假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
  • 示例
    • 示例 1:
      • 输入: “42”
      • 输出: 42
    • 示例 2:
      • 输入: " -42"
      • 输出: -42
      • 解释: 第一个非空白字符为 ‘-’, 它是一个负号。我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。
    • 示例 3:
      • 输入: “4193 with words”
      • 输出: 4193
      • 解释: 转换截止于数字 ‘3’ ,因为它的下一个字符不为数字。
    • 示例 4:
      • 输入: “words and 987”
      • 输出: 0
      • 解释: 第一个非空字符是 ‘w’, 但它不是数字或正、负号。因此无法执行有效的转换。
    • 示例 5:
      • 输入: “-91283472332”
      • 输出: -2147483648
      • 解释: 数字 “-91283472332” 超过 32 位有符号整数范围。 因此返回 INT_MIN (−231) 。

解答

  • 思路
    • 抛弃开始的空格
    • 获取符号
    • 循环
      • 尽可能的获取数字
      • 如果获取数字失败,则停止循环
      • 注意数字上下限问题
    • 返回结果,注意上下限
  • Code
    class Solution {
    public:
        int myAtoi(string str) {
            int l = 0, len=str.size();
            // 丢弃开始的Block
            for(auto &a:str){
                if(a==' ') {++l; continue;}
                break;
            }
            // 获取符号
            int Flag = 1;
            if(str[l]=='-'){
                ++l; Flag = -1;
            }else if(str[l]=='+'){
                ++l; Flag = 1;
            }
            // 转换
            long int res = 0;
            for(;l<len; ++l){
                if(str[l]<'0' || str[l]>'9') { break;}
                res = res*10 + (str[l]-'0');
                
                if(Flag * res > INT_MAX) {return INT_MAX;}
                if(Flag * res < INT_MIN) {return INT_MIN;}
            }
            if(Flag * res > INT_MAX) {return INT_MAX;}
            if(Flag * res < INT_MIN) {return INT_MIN;}
            return Flag * res;
        }
    };
    

报数

  • 报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
  1. 1
    
  2. 11
    
  3. 21
    
  4. 1211
    
  5. 111221
    
  • 1 被读作 “one 1” (“一个一”) , 即 11。
  • 11 被读作 “two 1s” (“两个一”), 即 21。
  • 21 被读作 “one 2”, “one 1” (“一个二” , “一个一”) , 即 1211。
  • 给定一个正整数 n(1 ≤ n ≤ 30),输出报数序列的第 n 项。
  • 注意:整数顺序将表示为一个字符串。
  • 示例
    • 示例 1:
      • 输入: 1
      • 输出: “1”
    • 示例 2:
      • 输入: 4
      • 输出: “1211”

解答

  • 思路
    • 使用快慢指针来统计出现的数字
  • Code
    class Solution {
    public:
        string countAndSay(int n) {
            if(n==1){return "1";}
            string Last = countAndSay(n-1);
            
            string Res="";
            int l=0, sl=0, len=Last.size();
            for(; l<len;l++){
                if(Last[l]!=Last[sl]){ // 21
                    Res += to_string(l-sl);
                    Res += to_string(Last[sl]-'0');
                    sl = l;
                }
            }
            Res += to_string(l-sl);
            Res += to_string(Last[sl]-'0');
            return Res;
        }
    };
    

最长公共前缀

说明

  • 编写一个函数来查找字符串数组中的最长公共前缀。
  • 如果不存在公共前缀,返回空字符串 “”。
  • 示例
    • 示例 1:
      • 输入: [“flower”,“flow”,“flight”]
      • 输出: “fl”
    • 示例 2:
      • 输入: [“dog”,“racecar”,“car”]
      • 输出: “”
      • 解释: 输入不存在公共前缀。
  • 说明:
    • 所有输入只包含小写字母 a-z

解答

  • 思路:
    • 边界条件为:
      • 某一个字串到尾了
      • 发现一个字串不等
  • Code
    class Solution {
    public:
        string longestCommonPrefix(vector<string>& strs) {
            if(strs.size()==0) {return "";}
            for(int idx = 0; idx < strs[0].size(); ++idx){
                char c = strs[0][idx];
                for(int strIdx=1; strIdx < strs.size(); ++strIdx){
                    if((strs[strIdx].size()==idx) || strs[strIdx][idx]!=c){
                        return strs[0].substr(0,idx);
                    }
                }
            }
            return strs[0];
        }
    };
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值