【daily leetcode】20191021

目标:字符串初级入门

  • 344 反转字符串 【 void reverseString(vector<char>& s) 】
  • 7 整数反转 【int reverse(int x) 】
  • 387 字符串的第一个唯一字符 【 int firstUniqChar(string s)】
  • 24 有效的字母异位词 【bool isAnagram(string s, string t)】
  • 125 验证回文字符串 【 bool isPalindrome(string s) 】
  • 8 字符串转换整数 【int myAtoi(string str)】
  • 28 实现strStr() 【int strStr(string haystack, string needle)】
  • 报数 【未完成】
  • 最前公共前缀 【未完成】
  • 93 复原IP地址 【vector<string> restoreIpAddresses(string s)】
  • 错误整理

344.反转字符串 reverse string

  • 首位双指针 交换
  • 注意传入的参数是 vector<char> 最后一个为\0
class Solution {
public:
    void reverseString(vector<char>& s) {
        
        int left = 0 ;
        int right = s.size()-1;
        
        while(left < right){
            char temp = s[right];
            s[right] = s[left];
            s[left] =temp; 
            left++;
            right--;
        }
    }
};

7.整数反转

  • 每次取出最后一位 和 累计值相加

pop operation:
pop = x % 10;
x /= 10;
push operation:
rev = rev * 10 + pop;

  • 每次相加前判断是否有溢出

2^31-1=2147483647
-2^31= -2147483648

  • 如123 , 0 x 3+3 =3 ,3 x 10+2 =32 , 32 x 10+1 =321
class Solution {
public:
    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;
//如果不知道7 怎么算出来 
// if(rev > INT_MAX/10 || ( rev == INT_MAX/10 && pop > INT_MAX %10 )) 
            if(rev < INT_MIN/10 || ( rev == INT_MIN/10 && pop < -8))
                return 0;
            rev = rev*10 + pop;
        }
        return rev;
    }
};

// 2^31-1=2147483647
//-2^31=-2147483648

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

  • 哈希表 第一次遍历 记录每个字符出现的次数
  • 第二次变量 找出现次数为1 的字符
class Solution {
public:
    int firstUniqChar(string s) {
        unordered_map<char, int> hash;
        for(char x : s){
            hash[x]++ ;
        }
        for(int i = 0; i < s.size(); i++){
            if(hash[s[i]] == 1)
                return i;
        }
        return -1;
        
    }
};

24.有效的字母异位词

  • 什么是异位词 长度相同 字母出现次数相同 但位置不一定一样

哈希映射##

首先判断两个字符串长度是否相等,不相等则直接返回 false
若相等,遍历字符串 s 和 t.初始化 26 个字母哈希表,
s 负责在对应位置的次数增加,t 负责在对应位置次数减少
s和t遍历结束后,遍历哈希表的值若都为 0,则二者是字母异位词

class Solution {
public:
    bool isAnagram(string s, string t) {
        
        if(s.size() != t.size()) return false;
        
        int hash[26] = {0};
        for(int i= 0 ; s[i] != '\0'; i++){
            hash[s[i]-'a'] ++;
            hash[t[i]-'a'] --;
        }
        
        for(auto x : hash){
            if(x != 0) return false;
        }
        
        return true;
    }
};

125.验证回文字符串

  • 只考虑字符和数字
  • 忽略大小写

在相同字母的大小写的二进制表示里,只有第5位不同,异或32可以起到只改变第5位的效果,从而实现大小写的转化。
只是改变第五位的效果

class Solution {
public:
    bool isPalindrome(string s) {
        int i = 0;
        int j = s.size() - 1;
        while(i < j) {
            while(i < j && !check(s[i])) i++; // 找到数字或者字符
            while(i < j && !check(s[j])) j--;
            if(s[i] != s[j] && s[i] != (s[j]^32))  return false;
            i++;
            j--;
        }
        return true;
    }
    
    bool check(char c){
        return c >= '0' && c <= '9' || c >='a' && c <='z' || c >= 'A' && c <= 'Z';
    }

};
    
class Solution {
public:
    bool isPalindrome(string s) {
        int i = 0;
        int j = s.size() - 1;
        while(i < j) {
            while(i < j && !check(s[i])) i++;
            while(i < j && !check(s[j])) j--;
            // if(s[i] != s[j] && s[i] != (s[j]^32))  return false;
            if(s[i] != s[j] )  {
                if (isdigit(s[i]) || isdigit(s[j])) return false;  // 如果有一个是数字的话 就直接返回、
      //都是数字的话才进行比较
                if (s[i] > s[j] &&  s[i]-s[j] !=32)
                    return false;
                if (s[i] < s[j] && s[j]-s[i] !=32)
                    return false;
            }
            
            i++;
            j--;
        }
        return true;
    }
    
    bool check(char c){
        return c >= '0' && c <= '9' || c >='a' && c <='z' || c >= 'A' && c <= 'Z';
    }

};
    

8.字符串转换整数

  • 找到第一个非空字符 进行判断

对非空字符的判断 //

  • 若为 ‘+’ '- ' 进行特殊处理
  • 若为其他 如果符合数字的条件就相加
class Solution {
public:
    int myAtoi(string str) {
        long long res = 0;
        int minus = 1;
        int k = 0;
        while(k < str.size() && (str[k] == ' ' || str[k] == '\t')) k++; //定位第一个非空字符
        
        if(k >= str.size()) return 0; 
        
        if(str[k] == '-') minus=-1, k++;
        
        if(str[k] == '+') {
            if(minus == -1) return 0;
            else k++;     
        }
        // 对 + - 特殊处理
        while(str[k] >= '0' && str[k] <= '9')
        {
            res = res*10 + str[k] - '0';
            k++;
            if(res > INT_MAX) break;
        }
        
        res *= minus;
        if(res > INT_MAX) return INT_MAX;
        if(res < INT_MIN) return INT_MIN;
        
        return res;
   
    }
       
};

28.实现strStr

  • 暴力枚举
  • 注意外层 和 内层循环的 循环退出的条件
class Solution {
public:
    int strStr(string haystack, string needle) {
        int n = haystack.size();
        int m = needle.size();
        
        for(int i = 0; i < n-m+1; i++){
            bool find = true;
             for(int j = 0; j < m; j++ ){
                if( haystack[i+j] != needle[j] ) {
                    find = false;
                    break; 
                }       
            }
            if(find)  return i;
        }
        
        return -1;
    }
};

93 .复原IP地址

  • 回溯 与 递归
class Solution {
public:
    vector<string> res;
    
    vector<string> restoreIpAddresses(string s) {
        string temp;
        dfs(s,temp,0);
        return res;
    }
    
    void dfs(string s, string &temp, int word_num){
        if(word_num == 4){
            if(s.empty()) 
                res.push_back(temp);
        }
        else{
            if(word_num > 0) temp += '.';
            for(int i = 1; i <= 3 && i <= s.size(); i++){
                if(valid(s.substr(0,i))) {
                    temp += s.substr(0,i);
                    dfs(s.substr(i,s.length()-i),temp,word_num+1);
                    temp.erase(temp.length()-i,i);
                }
            }
            temp.pop_back();
        }
    }
    
    bool valid(const string &s){
        if(s.empty() || (s[0] == '0' && s.size() >1) )
            return false;
        //空串 或者 有前导0的情况
        int val = stoi(s);
        if(val >= 0 && val <= 255)
            return true;
        
        return false;
    }
};

错误整理

  • 实现strStr


    image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。