leetcode 初级算法 字符串

反转字符串

题目:把vector char反转

AC代码:

class Solution {
public:
    void reverseString(vector<char>& s) {
        char temp;
        int len = s.size();
        int bound = len/2;
        for(int i = 0;i<bound;i++)
        {
            temp = s[i];
            s[i] = s[len-1-i];
            s[len-1-i] = temp;
        }
    }
};

整数反转

题目:将给定的32位整数取反(321变为123),如果overflow,返回0。

AC代码:

class Solution {
public:
    int reverse(int x) {
        long temp = x;
        int sig = temp>0?1:-1;   //符号
        int min = 0x80000000,max = 0x7FFFFFFF;
        vector<int> v;
        temp /= sig;   //abs
        while(temp!=0)
        {
            int cur=temp%10;
            temp/=10;
            v.push_back(cur);
        }
        long value = 0;
        for(int i = 0;i<v.size();i++)
        {
            value = value * 10 + (v[i]);
        }
        value *= sig;
        if(value<min||value>max)
            return 0;
        else
            return value;
    }
};

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

错误代码:
//错误原因:生成的uniq并不是唯一的字符集合,而是所有字符。

class Solution {
public:
    int firstUniqChar(string s) {
        //找到所有没重复出现的字符,无则返回-1,然后再从左到右扫描,第一次出现set中有的字符,返回下标。
        set<char> uniq;
        int len = s.size();
        string temp(s);
        sort(temp.begin(),temp.end());
        for(int i = 0;i<len;)
        {
            uniq.insert(temp[i]); 
            while(i<len-1&&temp[i]==temp[i+1])
                i++;
            i++;
        }
         for(int i = 0;i<len;i++)
        {
             if(uniq.find(s[i])!=uniq.end())
                 return i;
        }
        return -1;
    }
};

正确代码:

  class Solution {
    public:
        int firstUniqChar(string s) {
            //找到所有没重复出现的字符,无则返回-1,然后再从左到右扫描,第一次出现set中有的字符,返回下标。
            set<char> uniq;
            int len = s.size();
            string temp(s);
            sort(temp.begin(),temp.end());
            for(int i = 0;i<len;)
            {
                if(i==len-1||temp[i]!=temp[i+1])   //如果已经是最后一个了,或者是不等于下一个
                { uniq.insert(temp[i]);
                 i++;}
                else
                    //有重复的
                {
                    while(i<len-1&&temp[i]==temp[i+1])
                        i++;
                    i++;
                }
            }
             for(int i = 0;i<len;i++)
            {
                 if(uniq.find(s[i])!=uniq.end())
                     return i;
            }
            return -1;
        }
    };

有效的字母异位词

AC代码:

class Solution {
public:
    bool isAnagram(string s, string t) {
        int len1 = s.size(),len2 = t.size();
        if(len1!=len2) return false;
        sort(s.begin(),s.end());
        sort(t.begin(),t.end());
        for(int i = 0;i<len1;i++)
            if(s[i]!=t[i])
                return false;
        return true;
    }
};

验证回文字符串

运行超时了
错误代码:

class Solution {
public:
    //忽略大小写(所以最开始全部转换为大写),只考虑数字和字母
    bool isPalindrome(string s) {
        int p2 = s.size()-1;
        int p1 = 0;
        if(p2==-1) return true;     //空字符串也符合
        upper(s);
        //move函数将前后指针移到下一个数字或者字母
        moveF(s,p1);
        moveB(s,p2);
        while(p1<p2)
        {
            if(s[p1]!=s[p2])
                return false;
            moveF(s,p1);
            moveB(s,p2);
        }
        return true;
    }
    void upper(string& s)
    {
        int len = s.size();
        for(int i = 0;i<len;i++)
        {
            //如果是小写字母,转换为upper case
            if(s[i]>='a'&&s[i]<='z')
                s[i] += ('A'-'a');
        }
    }
    void moveF(string& s,int& p)
    {
        int len = s.size();
        while(p<len)    //可以向前移动,且有必要
        {
            if(s[p]>='A'&&s[p]<='Z')
                return;
            if((s[p]>='0'&&s[p]<='9'))
               return;
               p++;
        }
              //返回可能是找到了,也可能因为到头了
    }
    void moveB(string& s,int& p)
    {
        while(p>=0)    //可以向前移动,且有必要
        {if(s[p]>='A'&&s[p]<='Z')
                return;
            if((s[p]>='0'&&s[p]<='9'))
               return;
               p--;
        }
    }
};

字符串转换整数(atoi)

写的逻辑很麻烦,回头再看能否改善。
AC代码:

    class Solution {
    public:
        int myAtoi(string str) {
            int max = 0x7fffffff,min=0x80000000;
            int i = 0;
            long val = 0,sig=1,start=0;
            int len = str.length();
            if(len==0) return 0;   //字符串空
            while(i<len&&str[i]==' ')
                i++;        //ignore spaces before num
            if(i==len)     //如果全空,返回0
                return 0;
            if(!( str[i]=='+' || str[i]=='-' || (str[i]>='0'&&str[i]<='9') ))
                return 0;
            if(str[i]=='-')
                sig = -1;
            if(str[i]=='+'||str[i]=='-')
                i++;
            bool flag = false;
            while(i<len&&str[i]>='0'&&str[i]<='9')
            {
                if(str[i]!='0') flag=true;
                if(flag) start++;
                if(start>=11)
                {
                    if(sig==1)
                        return max;
                    else
                        return min;
                }
                val = val*10+(str[i]-'0');
                i++;
            }
            val *= sig;
            if(val>max)
                val=max;
            else if(val<min)
                val = min;
            return val;
        }
    };

## 实现strStr()
思路:取长度一样的haystack子串与needle比较,匹配,返回此时子串的起始下标。
AC代码:
class Solution {
public:
    int strStr(string haystack, string needle) {
        int len1 = haystack.length(),len2=needle.length();
        if (len1<len2) return -1;
        for(int i =0;i<=len1-len2;i++)
        {
            if(match(haystack.substr(i,len2),needle))
                return i;
        }
        return -1;
    }
    bool match(string s1,string s2)
    {
        int len = s1.length();
        for(int i = 0;i<len;i++)
        {
            if(s1[i]!=s2[i])
                return false;
        }
        return true;
    }
};
## 报数
AC代码:
class Solution {
public:
    string countAndSay(int n) {
        string init="1";
        n=n-1;
        while(n--)
        {
            init=count(init);
        }
        return init;
    }
    string count(string init)
    {
        string newStr;
        int len = init.size();
        int pos = 0;
        while(pos<len)
        {
            int cnt = 1;
            char val = init[pos];
            pos++;
            while(pos<len&&init[pos]==val)
            {cnt++;pos++;}
            newStr.insert(newStr.end(),cnt+'0');
            newStr.insert(newStr.end(),val);
        }
        return newStr;
    }
};

最长公共前缀

AC代码:

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        //找到最短的字符串,以它为基准
        int minLen = 10000;
        string base;
        for(int i = 0;i<strs.size();i++)
        {
            string s = strs[i];
            int len = s.length();
            if(len<minLen)
            {
                base = strs[i];
                minLen = len;
            }
        }
        cout<<base;
        if(minLen==0)
            return "";
        int p = 0;
        int i;
        for(i = 0;i<minLen;i++)    //慢慢扩大长度
        {
            int j = 0;
            for(;j<strs.size();j++)
            {
                string s = strs[j];
                if(s.substr(0,i+1)!=base.substr(0,i+1))
                    break;   //有一个串没有这个前缀就不行
            }
            if(j!=strs.size())
                break;             //判断j这个长度的前缀是否都有
        }
        if(i==0) return "";
        return base.substr(0,i);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值