算法复习:字符串集
以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; } };
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; } };