zoukankan      html  css  js  c++  java
  • 算法复习:字符串集

    表示数值的字符串

    以e或E分成两部分分别判断即可。

    int maxl(int a,int b)
    {
        if(a>b)
            return a;
        return b;
    }
    class Solution {
    public:
        bool isNumeric(string str)
        {
            int lable=0,pos=maxl(str.find("e",0),str.find("E",0));
            string up="",down="";
            if(pos==-1)
                up=str;
            else
            {
                up=str.substr(0,pos);
                down=str.substr(pos+1,str.size()-pos);
                if(down=="")
                    return false;
            }
            for(int i=0;i<up.size();i++)
            {
                if((up[i]=='+'||up[i]=='-')&&i==0)
                    continue;
                if((up[i]=='+'||up[i]=='-')&&i!=0)
                    return false;
                if(up[i]=='.')
                {
                    if(lable==1)
                        return false;
                    lable=1;
                    if(up[i+1]>='0'&&up[i+1]<='9')
                        continue;
                    else
                        return false;
                }
                if(up[i]<'0'||up[i]>'9')
                    return false;
            }
            for(int i=0;i<down.size();i++)
            {
                if((down[i]=='+'||down[i]=='-')&&i==0)
                    continue;
                if((down[i]=='+'||down[i]=='-')&&i!=0)
                    return false;
                if(down[i]=='.')
                    return false;
                if(down[i]<'0'||down[i]>'9')
                    return false;
            }
            return true;
        }
    
    };
    牛客

    字符流中第一个不重复的字符

    一个维护当前首次出现的字符顺序表,一个维护出现的字符数目表

    class Solution
    {
    public:
        string donser;
        void Insert(char ch)
            donser=donser.insert(donser.size(),1,ch);     
        char FirstAppearingOnce()
        {
            char first=donser[0];
            vector<char>vec;
            vector<char>::iterator it;
            map<char,int>mp;
            for(int i=0;i<donser.size();i++)
            {
                it=find(vec.begin(),vec.end(),donser[i]);
                if(it==vec.end()&&mp[donser[i]]==0)
                    vec.push_back(donser[i]);
                else if(it!=vec.end()&&mp[donser[i]]!=0)
                    vec.erase(it);
                mp[donser[i]]++;
            }
            if(vec.size()==0)
                return '#';
            return *(vec.begin());
        }
    
    };
    牛客

    面试题 08.09. 括号

    给定一个数n,表示总共有n个左括号,n个右括号,输出不同的匹配,右括号不能多于左括号

    class Solution {
    public:
        int N;//最多的括号数目
        vector<string> result;
        string tmp;
        void loop(int l,int r)
        {
            //cout<<"L:"<<l<<" R:"<<r<<endl;
            if(l<N)
            {
                if(l==r)
                {
                    tmp[l+r]='(';
                    loop(l+1,r);
                }
                else if(l>r)
                {
                    tmp[l+r]='(';
                    loop(l+1,r);
                    tmp[l+r]=')';
                    loop(l,r+1);
                }
            }
            else if(l==N)//左括号饱和
            {
                if(r<N)//右括号没包和
                {
                    tmp[l+r]=')';
                    loop(l,r+1);
                }
                else if(r==N)
                {
                    result.push_back(tmp);
                    //cout<<tmp<<endl;
                    return;
                }
            }
            return;
        }
        vector<string> generateParenthesis(int n) {
            string str(n*2,'0');
            N=n;
            tmp=str;
            loop(0,0);
            return result;
        }
    };
    View Code

    leetcode 6. Z 字形变换

    找数字行间下标规律

    class Solution {
    public:
        string convert(string s, int numRows) {
            if(numRows<=1)
                return s;
            string result="";
            int seg1=(numRows-1)*2;
            int seg2=0;
            for(int i=0;i<numRows;i++)//逐行处理
            {
                int now=i;//记录当前下标
                int last=-1;//记录上一个下标
                int lb=0;//循环两种间隔
                while(now<s.size())//循环输出
                {
                    if(last!=now)//排除间隔为0的情况
                        result+=s[now];
                    if(lb==0)
                    {
                        lb=1;
                        last=now;
                        now+=seg1;
                    }
                    else if(lb==1)
                    {
                        lb=0;
                        last=now;
                        now+=seg2;
                    }
                }
                seg1-=2;
                seg2+=2;
            } 
            return result;
        }
    };
    leetcode 6
  • 相关阅读:
    C/C++知识点收集
    JAVA相关知识点理解
    Windows相关收集
    【原创】java的反射机制
    【原创】如何配置声明书事务
    【原创】spring中的事务传播特性
    【摘录】JAVA内存管理-自动选择垃圾收集器算法
    【摘录】JAVA内存管理-JVM垃圾收集机制
    【摘录】数据库拆分的一般方法和原则
    【摘录】JAVA内存管理-有关垃圾收集的关键参数
  • 原文地址:https://www.cnblogs.com/dzzy/p/12275518.html
Copyright © 2011-2022 走看看