华为机试--牛客刷题
来源:互联网 发布:ac-尼尔森数据 编辑:程序博客网 时间:2024/06/05 05:27
1. 字符串最后一个单词的长度
int main() { string input; while(getline(cin,input)) { int size=input.size()-1; int count=0; while(input[size]!=' '&&size>=0) { size--; count++; } cout<<count; } return 0;}int main() { string input; while(getline(cin,input)) { stringstream ss(input); string word; while(ss>>word) ; cout<<word.size(); } return 0;}
2.计算字符串个数
int main(){ string input; getline(cin,input); map<char,int> index; char ch; cin>>ch; for(int i=0;i<input.size();++i) index[input[i]]++; int res=index[toupper(ch)]+index[tolower(ch)]; cout<<res;}int numOfString(string s, char target);int main(){ string str; int num; char target; getline(cin,str); cin >> target; num = numOfString(str, target); cout << num << endl;}int numOfString(string s,char target) { int res=0; int len = s.size(); for (int i = 0; i < len; ++i) { if (s[i] == tolower(target) || s[i] == toupper(target)) ++res; } return res;}
3.排序,去重
void QuickSort(vector<int>& vec,int low,int high);int Partition(vector<int>& vec, int low, int high);vector<int> del(vector<int>& vec);int main() { int n; while( cin>>n){ int index=n; vector<int> vec; while(index--) { int num; cin>>num; vec.push_back(num); } QuickSort(vec,0,vec.size()-1); vector<int> res; res=del(vec); //vector<int>::iterator it=unique(vec.begin(),vec.end()); //vec.erase(it,vec.end()); for(int i=0;i<res.size();++i) cout<<res[i]<<endl; } return 0;}//去重vector<int> del(vector<int>& vec){ vector<int> res; vector<int>::iterator it=vec.begin(); res.push_back(*it); int itR=0; while(it!=(vec.end()-1)) { if(*++it!=res[itR]) { res.push_back(*it); itR++; } } return res;}//排序void QuickSort(vector<int>& vec,int low,int high){ int pivot=0; if (low < high) { pivot = Partition(vec,low,high); QuickSort(vec, low, pivot-1); QuickSort(vec, pivot+1, high); }}int Partition(vector<int>& vec, int low, int high){ int pivotkey = vec[low]; while (low < high) { while (low < high&&vec[high]>=pivotkey) high--; if (low < high) vec[low++] = vec[high]; while (low < high&&vec[low] <= pivotkey) low++; if (low<high) vec[high--] = vec[low]; } vec[low] = pivotkey; return low;}
方法二:
void Solution(int num);int main(){ int count; while(cin >> count) Solution(count); return 0;}void Solution(int num){ vector<int> rnd; int opt; for (int i = 0; i < num; ++i) { cin >> opt; rnd.push_back(opt); } sort(rnd.begin(),rnd.end()); auto end = unique(rnd.begin(), rnd.end()); rnd.erase(end,rnd.end()); for (int i : rnd) cout << i << endl;}
4.分割字符串
void Sol(vector<string>& res,string in);int main(){ string input1; string input2; getline(cin,input1); getline(cin,input2); vector<string> res; Sol(res,input1); Sol(res,input2); for(int i=0;i<res.size();++i) cout<<res[i]<<endl;}void Sol(vector<string>& res,string in){ if(in.empty()) return; if(in.size()<=8) { for(int i=in.size();i<8;i++) in+='0'; res.push_back(in); } else{ int i=0; while(i<in.size()) { string word; for(int index=0;index<8;index++) { if(i+index<in.size()) word+=in[i+index]; else word+='0'; } res.push_back(word); i+=8; } } }
5.进制转换
#include<vector>#include<string>#include<algorithm>#include<iostream>#include<sstream>#include<map>using namespace std;map<char,int> mapindex= { { '0', 0 }, { '1', 1 }, { '2', 2 }, { '3', 3 }, { '4', 4 }, { '5', 5 }, { '6', 6 }, { '7', 7 }, { '8', 8 }, { '9', 9 }, { 'a', 10 }, { 'A', 10 }, { 'b', 11 }, { 'B', 11 }, { 'C', 12 }, { 'c', 12 }, { 'd', 13 }, { 'D', 13 }, { 'E', 14 }, { 'e', 14 }, { 'f', 15 }, { 'F', 15 }};int main(){ string in; while(cin>>in) { string result; int res=0; if(in.size()<3) break; if(in[0]!='0'||(in[1]!='x'&&in[1]=='X')) break; int index=2; for(;index<in.size();++index) res=res*16+mapindex[in[index]]; stringstream ss; ss<<res; ss>>result; //注意要加endl,否则就会出错 cout<<result<<endl; } return 0;}
6.质数因子
string getResult(long ulDataInput){ long res=ulDataInput; vector<int> vec; //此处的循环条件要注意 for(int i=2;i<=res;++i) { while(res%i==0) { vec.push_back(i); res/=i; } } stringstream ss; for(int i=0;i<vec.size();++i) { ss<<vec[i]<<' '; } return ss.str();}int main(){ long in; while(cin>>in){ cout<<getResult(in); } return 0; }
7.浮点数:接受一个正浮点数值,输出该数值的近似整数值。如果小数点后数值大于等于5,向上取整;小于5,则向下取整。
int main() { float in; while(cin>>in) { int res=in; if((in-res)<0.5) cout<<res; else cout<<res+1; } return 0;}
8.合并表记录
int main() { int num; map<int,int> map; cin>>num; while(num--) { int index,key; cin>>index>>key; map[index]+=key; } for(auto i:map) { cout<<i.first<<" "<<i.second<<endl; } return 0;}
9.重复的整数
#include<iostream>#include<vector>#include<algorithm>using namespace std;long long noRepeat(long long in) { long long res=0; vector<int> index; index.clear(); while(in!=0) { int i=in%10; if(find(index.begin(),index.end(),i)==index.end()) index.push_back(i); in/=10; } for(int i=0;i<index.size();++i) res=res*10+index[i]; return res;}int main() { int in; cin>>in; cout<<noRepeat(in)<<endl; return 0;}
10.字符个数统计
#include<iostream>#include<set>using namespace std;int number(string in) { set<char> index; for(int i=0;i<in.size();++i) index.insert(in[i]); return index.size();}int main() { string in; cin>>in; cout<<number(in); return 0;}
11.数字颠倒
#include<iostream>#include<vector>#include<sstream>using namespace std;int main() { long long in; while(cin>>in){ vector<int> index; for(int i=0;i<res.size();++i) { index.push_back(in%10); in/=10; } stringstream ss; for(int i=0;i<index.size();++i) ss<<index[i]; cout<<ss.str()<<endl; } return 0;}
12.字符串的翻转
#include<iostream>#include<string>#include<vector>#include<sstream>using namespace std;int main() { string in; while(cin>>in){ string res; for(int i=in.size()-1;i>=0;--i) res+=in[i]; cout<<res; } return 0;}
13.翻转字符串的单词
string reverse(string in){ string res; if(in.empty()) return res; stringstream ss(in); string word; vector<string> vec; while(ss>>word) vec.push_back(word); for(int i=vec.size()-1;i>0;--i) { res+=vec[i]; res+=' '; } res+=vec[0]; return res;}int main(){ string input; while (getline(cin, input)) { cout << reverse(input); } return 0;}
14.给定n个字符串,请对n个字符串按照字典序排列。
#include<iostream>#include<string>#include<vector>using namespace std;int Partition(vector<string> &vec,int low,int high) { string index=vec[low]; while(low<high) { while(low<high&&index<=vec[high]) high--; if(low<high) vec[low++]=vec[high]; while(low<high&&index>=vec[low]) low++; if(low<high) vec[high--]=vec[low]; } vec[low]=index; return low;}void sort(vector<string> &vec,int low,int high){ int index=0; while(low<high) { index=Partition(vec,low,high); sort(vec,low,index-1); //快排递归时做一下优化,减少递归时的栈空间 low=index+1; }}int main(){ int num; while (cin >> num) { vector<string> res; string tmp; while (num) { cin >> tmp; res.push_back(tmp); --num; } sort(res,0,res.size()-1); for(int i=0;i<res.size();++i) cout<<res[i]<<endl; } return 0;}
15.int型中1的个数:
/*输入一个int型数据,计算出该int型数据在内存中存储时1的个数。*/#include<iostream>using namespace std;unsigned Solution(int in){ //循环最高位1所在的位数次 unsigned count=0; while(in!=0) { if(in&1) count++; in=in>>1; } return count;}int main(){ int num; while (cin >> num) { cout<<Solution(num); } return 0;}
unsigned Solution(int in){ //循环int中1个数次 unsigned count=0; while(in) { count++; in=in&(in-1); } return count;}
16.字符串匹配:判断短字符串中的所有字符是否在长字符串中全部出现
#include<string>#include<set>#include<iostream>using namespace std;bool IsAllCharExist(string s1,string s2){ bool flag=true; int len1=s1.size(); int len2=s2.size(); set<char> index; for(int i=0;i<len2;++i) { index.insert(s2[i]); } for(int j=0;j<len1;++j) { if(index.find(s1[j])==index.end()) { flag=false; break; } } return flag;}int main() { string s1,s2; while(cin>>s1) { cin>>s2; if(IsAllCharExist(s1,s2)) cout<<"true"<<endl; else cout<<"false"<<endl; }}
17.最长公共子串
动态规划:
#include<iostream>#include<vector>#include<string>using namespace std;string maxString(string str1,string str2){ int len1=str1.size(); int len2=str2.size(); vector<int> tmp(len1,0);//存放前一行的结果 vector<int> cur(len1,0);//存放当前行的结果 int maxlen=0;//最长的公共子串长度 int pos=0;//标记最长公共子串最后的位置 for(int i=0;i<len2;i++) { //当前行清零 cur.assign(len1,0); for(int j=0;j<len1;++j) { if(str2[i]==str1[j]) { if(j==0) cur[j]=1; //若匹配,则当前行为前一行j-1位置处值+1; else cur[j]=tmp[j-1]+1; } //输出短字符串中最早出现的最长公共子串 if(cur[j]>maxlen) { maxlen=cur[j]; pos=j; } //最长的长度相同的情况,判断若在短字符串中出现的更早,更新位置标记 else if(maxlen==cur[j]&&j<pos) { pos=j; } } tmp=cur; } string res=str1.substr(pos-maxlen+1,maxlen); return res;}int main(){ string str1,str2; while(cin>>str1>>str2) { if(str1.size()>str2.size()) cout<<maxString(str2,str1); else cout<<maxString(str1,str2); cout<<endl; } return 0;}
解二:
#include<iostream>#include<vector>#include<string>#include<algorithm>using namespace std;//找到子串中最长的int findMaxLen(vector<string> vec){ int res=vec[0].size(); for(int i=0;i<vec.size();++i) { if(vec[i].size()>res) res=vec[i].size(); } return res;}string Find(string s1,string s2){ string res; //存放所有的子串 vector<string> vec; int len1=s1.size(); int len2=s2.size(); int i=0,j=0,w=0; //三个for循环 for(i=0;i<len1;++i) { for(j=0;j<len2;++j) { string word=""; int index=i; for(w=j;w<len2;++w) { if(s1[index++]==s2[w]) word.push_back(s2[w]); else break; } if(!word.empty()) vec.push_back(word); } } int max=findMaxLen(vec); for(int i=0;i<vec.size();++i) { if(vec[i].size()==max) { res=vec[i]; break; } } return res;}int main(){ string s1,s2; while(cin>>s1>>s2) { if(s1.size()<s2.size()) cout<<Find(s1,s2)<<endl; else cout<<Find(s2,s1)<<endl; }}
18.最小公倍数
#include<iostream>#include<vector>using namespace std;int min(int i,int j) { return i>j?j:i;}int minNum(int in1,int in2) { int div1=in1; int div2=in2; int res=1; vector<int> vec; for(int i=2;i<=min(div1,div2);++i) { if(div1%i==0&&div2%i==0) { vec.push_back(i); div1/=i; div2/=i; } } vec.push_back(div1); vec.push_back(div2); for(int i=0;i<vec.size();++i) res*=vec[i]; return res;}int main() { int i,j; while(cin>>i>>j) { cout<<minNum(i,j)<<endl; }}
19.求立方根
#include<iostream>#include<vector>using namespace std;const double DIV=0.0000001;inline double abs(double x){return (x>0?x:-x);}static double getCubeRoot(double input){ // double sum=0; double res; //牛顿迭代 for(res=1.0;!(abs(input-res*res*res)<DIV);res=(2*res*res*res+input)/(3*res*res)) ; return res;}int main() { double i; while(cin>>i) { //改变输出的格式 cout << fixed; //定点十进制 cout.precision(1); //默认精度值控制为总位数,fixed/scientific/hexfloat之后改变为控制小数点后的位数 cout<<getCubeRoot(i)<<endl; }}
20.字符逆序
#include<iostream>#include<string>#include<stack>using namespace std;int main() { string in; //注意输入是一行字符串,所以必须要用getline来读取一行输入 while(getline(cin,in)) { string res; stack<char> stk; for(int i=0;i<in.size();++i) { stk.push(in[i]); } for(int i=0;i<in.size();++i) { char ch=stk.top(); res+=ch; stk.pop(); } cout<<res<<endl; }}
21.记负均正II
#include<iostream>#include<vector>using namespace std;int main() { vector<int> pos; vector<int> neg; int in=0; double sum=0; while(cin>>in) { if(in>=0) pos.push_back(in); else neg.push_back(in); } for(int i=0;i<pos.size();++i) sum+=pos[i]; cout<<neg.size()<<endl; double tmp=sum/(pos.size()); cout<<showpoint;//强制显示浮点数的小数点 cout<<tmp<<endl;}
22.Redraiment的走法–最大递增子序列问题;参照30合唱队问题
#include<iostream>#include<vector>using namespace std; int GetResult(int num, int* pInput){ //记录每个节点步数 int *step=new int[num]; //记录最长的结果 int pResult=1; //初始化每个节点步数数组 for(int i=0;i<num;++i) step[i]=1; //动态规划 for(int i=1;i<num;++i) for(int j=0;j<i;++j) //若果递增且当前递增序列个数大于已存的值,更新 if(pInput[i]>pInput[j]&&step[j]+1>step[i]) { step[i]=step[j]+1; if(step[i]>pResult) pResult=step[i]; } return pResult;}int main() { int num; while(cin>>num) { int *in=new int[num]; for(int i=0;i<num;++i) cin>>in[i]; cout<<GetResult(num,in)<<endl; } }
23.字符统计。按字符出现次数从多到少打印,同样次数按大小打印。
//思路:统计最多次出现的字符,从最多次开始打印,每次最多次--,再次遍历map。直到max到0,保证打印完所有的字符。#include<iostream>#include<map>#include<string>using namespace std;void Sol(string in){ map<char,int> index; //统计最长的字符 int max=0; for(int i=0;i<in.size();++i) { index[in[i]]++; if(index[in[i]]>max) max=index[in[i]]; } while(max) { for(map<char,int>::iterator it=index.begin();it!=index.end();it++) { if(it->second==max) cout<<it->first; } max--; } return;}int main(){ string in; while(cin>>in) { Sol(in); cout<<endl; } }
24.输入整型数组和排序标识,对其元素按照升序或降序进行排序
思路:快排做!快排的代码一定要熟悉!!!!!!!
#include<iostream>#include<vector>#include<string>using namespace std;int partition(vector<int>& in,int low,int high,int flag){ int key=in[low]; while(low<high&&flag==0) { while(low<high&&in[high]>key) high--; if(low<high) in[low++]=in[high]; while(low<high&&in[low]<key) low++; if(low<high) in[high--]=in[low]; } while(low<high&&flag==1) { while(low<high&&in[high]<key) high--; if(low<high) in[low++]=in[high]; while(low<high&&in[low]>key) low++; if(low<high) in[high--]=in[low]; } in[low]=key; return low;}void QuickSort(vector<int>& in,int low,int high,int flag){ if(low>=high) return; int index=partition(in,low,high,flag); QuickSort(in,low,index-1,flag); QuickSort(in,index+1,high,flag);}void sortIntegerArray(vector<int>& in, int flag){ QuickSort(in,0,in.size()-1,flag);}int main(){ int n; while(cin>>n) { vector<int> in; int w; for(int i=0;i<n;++i) { cin>>w; in.push_back(w); } int flag; cin>>flag; sortIntegerArray(in,flag); for(int i=0;i<in.size()-1;++i) cout<<in[i]<<" "; cout<<in[in.size()-1]<<endl; } }
25.自守数
思路:转换为string,判断短的字符串是否匹配。
#include<iostream>#include<vector>#include<string>using namespace std;//判断是否是自守数bool isT(int in){ int square=in*in; string s1; string s2; //in转换为逆序的string while(in) { s1+=(in%10+'0'); in/=10; } //平方数转换为逆序的string while(square) { s2+=(square%10+'0'); square/=10; } int i; //判断逆序后的结果前几位是否相等 for(i=0;i<s1.size();++i) { if(s1[i]!=s2[i]) break; } if(i==s1.size()) return true; return false;}int main(){ int n; while(cin>>n) { int count=0; for(int i=0;i<n;++i) { if(isT(i)) count++; } cout<<count<<endl; } }
26.数字前后加上符号“*”
思路:辅助空间字符串来做~
#include<iostream>#include<string>using namespace std;/*输入例子:Jkdi234klowe90a3输出例子:Jkdi*234*klowe*90*a*3**/int main(){ string in; while(getline(cin,in)) { string res; int flag=0; for(int i=0;i<in.size();i++) { if(flag==0&&!isdigit(in[i])) res+=in[i]; else if(flag==0&&isdigit(in[i])) { res+='*'; res+=in[i]; flag=1; } else if(flag==1&&isdigit(in[i])) { res+=in[i]; flag=1; } else if(flag==1&&!isdigit(in[i])) { res+='*'; res+=in[i]; flag=0; } } if(isdigit(in[in.size()-1])) res+='*'; cout<<res<<endl; }}
27.记票统计
思路:用vector实现输入的人名的先后,用map来做索引操作。
#include<iostream>#include<algorithm>#include<map>#include<vector>#include<string>using namespace std;map<string,int> index;vector<string> vec;int Invalid=0;unsigned int AddCandidate (string name){ int flag=1; if(find(vec.begin(),vec.end(),name)==vec.end()) vec.push_back(name); else flag=0; return flag;}void Vote(string name){ if(find(vec.begin(),vec.end(),name)!=vec.end()) index[name]++; else Invalid++;}unsigned int GetVoteResult (string name){ if(find(vec.begin(),vec.end(),name)!=vec.end()) return index[name]; return Invalid;}void Clear(){ index.clear(); vec.clear(); Invalid=0;}int main(){ //候选人个数 int n; int voteNum; while(cin>>n) { for(int i=0;i<n;++i) { string name; cin>>name; AddCandidate(name); } cin>>voteNum; for(int i=0;i<voteNum;++i) { string name; cin>>name; Vote(name); } for(int i=0;i<vec.size();++i) cout<<vec[i]<<" : "<<GetVoteResult(vec[i])<<endl; cout<<"Invalid : "<<Invalid<<endl; Clear(); }}
28.在字符串中找出连续最长的数字串
思路:注意考虑最后若为连续数字串的处理。
#include<iostream>#include<algorithm>#include<map>#include<vector>#include<string>using namespace std;int main(){ string in; while(cin>>in) { vector<string> vec; int flag=0; string tmp; for(int i=0;i<in.size();++i) { if(flag==0&&isdigit(in[i])) { tmp+=in[i]; flag=1; } else if(flag==1&&isdigit(in[i])) { tmp+=in[i]; if(i==in.size()-1) vec.push_back(tmp); } else if(flag==1&&!isdigit(in[i])) { vec.push_back(tmp); tmp.clear(); flag=0; } } int max=0; for(int i=0;i<vec.size();++i) { if(vec[i].size()>max) max=vec[i].size(); } for(int i=0;i<vec.size();++i) { if(vec[i].size()==max) cout<<vec[i]; } cout<<","<<max<<endl; }}
29.合法IP
思路:ip考虑是否为四个字符串,字符串转int后,必须小于255。且IP地址中除了数字和.不能有其他的字符。
#include<iostream>#include<algorithm>#include<sstream>#include<vector>#include<string>using namespace std;int main(){ string in; while(cin>>in) { vector<string> vec; string res="YES"; string tmp; for(int i=0;i<in.size();i++) { if(!(isdigit(in[i])||in[i]=='.')) res="NO"; } for(int i=0;i<in.size();i++) { if(isdigit(in[i])) { tmp+=in[i]; if(i==in.size()-1) vec.push_back(tmp);; } else if(in[i]=='.') { vec.push_back(tmp); tmp.clear(); } } if(vec.size()!=4) res="NO"; for(int i=0;i<vec.size();i++) { stringstream ss; ss<<vec[i]; int num; ss>>num; if(num>255) { res="NO"; break; } } cout<<res<<endl; }}
30.合唱队问题
思路:动态规划;
两次遍历,第一次找从头到尾最长递增子序列,第二次从尾到头找最长递增子序列。
i位置两个序列数组中和最大,则要踢出去的人数最少。最少人数为in+1-max;
#include<iostream>#include<algorithm>#include<sstream>#include<vector>#include<string>using namespace std;int main(){ int in; while(cin>>in) { vector<int> vec; for(int i=0;i<in;i++) { int tmp; cin>>tmp; vec.push_back(tmp); } vector<int> res1(in,1); vector<int> res2(in,1); for(int i=1;i<in;i++) for(int j=0;j<i;++j) if(vec[i]>vec[j]&&res1[j]+1>res1[i]) res1[i]=res1[j]+1; for(int i=in-2;i>=0;i--) for(int j=in-1;j>i;--j) if(vec[i]>vec[j]&&res2[j]+1>res2[i]) res2[i]=res2[j]+1; int max=-1; for(int i=0;i<vec.size();i++) { int sum=res1[i]+res2[i]; if(sum>max) max=sum; } cout<<in+1-max<<endl; } }
31.将真分数分解为埃及分数(贪心算法)
具体步骤参见:http://blog.csdn.net/hnust_xiehonghao/article/details/8682673
设a、b为互质正整数,a<b 分数a/b 可用以下的步骤分解成若干个单位分数之和:步骤一: 用b 除以a,得商数q1 及余数r1。`(r1=b - a*q1)`步骤二:把a/b 记作:`a/b=1/(q1+1)+(a-r)/b(q1+1)`步骤三:重复步骤2,直到分解完毕3/7=1/3+2/21=1/3+1/11+1/23113/23=1/2+3/46=1/2+1/16+1/368以上其实是数学家斐波那契提出的一种求解埃及分数的贪心算法,准确的算法表述应该是这样的:设某个真分数的分子为a,分母为b;把b除以a的商部分加1后的值作为埃及分数的某一个分母c;将a乘以c再减去b,作为新的a;将b乘以c,得到新的b;如果a大于1且能整除b,则最后一个分母为b/a;算法结束;或者,如果a等于1,则,最后一个分母为b;算法结束;否则重复上面的步骤。
牛客的测试用例有问题,思想对了就行了。答案不唯一。
#include<iostream>#include<algorithm>#include<sstream>#include<vector>#include<string>using namespace std;string toS(int i){ stringstream ss; ss<<i; string res; ss>>res; return res;}int toI(string i){ stringstream ss; ss<<i; int res; ss>>res; return res;}string Sol(string in){ string s1,s2; int flag=0; for(int i=0;i<in.size();i++) { if(flag==0&&in[i]!='/') s1+=in[i]; else if(flag==0&&in[i]=='/') flag=1; else if(flag==1) s2+=in[i]; } int a=toI(s1); int b=toI(s2); vector<string> vec; int q1,r1; while(b%a!=0) { q1=b/a; r1=b%a; a=a-r1; b=b*(q1+1); string tmp; tmp="1/"+toS(q1+1); vec.push_back(tmp); } string tmp; tmp="1/"+toS(b/a); vec.push_back(tmp); string res; for(int i=0;i<vec.size()-1;++i) res+=vec[i]+'+'; res+=vec[vec.size()-1]; return res;}int main(){ string in; while(cin>>in) { cout<<Sol(in)<<endl; }}
32.不区分大小写,求最长公共子串。
思路:对判断两个字符是否相等重新定义函数来做。
#include<vector>#include<string>#include<algorithm>#include<iostream>#include<sstream>#include<map>using namespace std;bool isEqual(char i,char j){ if(i==j||isupper(i)==j) return true; return false; }int maxString(string str1,string str2){ int len1=str1.size(); int len2=str2.size(); int maxlen=0; vector<int> tmp(len1,0); vector<int> cur(len1,0); for(int i=0;i<len2;++i) { cur.assign(len1,0); for(int j=0;j<len1;++j) { if(isEqual(str1[j],str2[i])) { if(j==0) cur[j]=1; else cur[j]=tmp[j-1]+1; } if(cur[j]>maxlen) maxlen=cur[j]; } tmp.assign(cur.begin(),cur.end()); } return maxlen;}int main(){ string in1,in2; while(cin>>in1>>in2) { cout<<maxString(in1,in2)<<endl; }}
33.字符串的编辑距离问题–计算字符串的相似度
思路:动态规划问题。类似于求最长公共子序列问题。
#include<vector>#include<string>#include<algorithm>#include<iostream>#include<sstream>#include<map>using namespace std;int min(int a,int b,int c){ int res=a; if(b<res) res=b; if(c<res) res=c; return res;}string toS(int i){ stringstream ss; ss<<i; string res; ss>>res; res="1/"+res; return res;}string disString(string str1,string str2){ int len1=str1.size(); int len2=str2.size(); vector<vector<int>> arr; for(int i=0;i<len1+1;++i) { vector<int> tmp; for(int j=0;j<len2+1;++j) { tmp.push_back(0); } arr.push_back(tmp); } for(int i=0;i<len1+1;++i) { arr[i][0]=i; } for(int i=0;i<len2+1;++i) { arr[0][i]=i; } for(int i=1;i<len1+1;++i) { for(int j=1;j<len2+1;++j) { if(str1[i-1]==str2[j-1]) arr[i][j]=min(arr[i-1][j-1],arr[i-1][j]+1,arr[i][j-1]+1); else arr[i][j]=min(arr[i-1][j-1]+1,arr[i-1][j]+1,arr[i][j-1]+1); } } return toS(arr[len1][len2]+1);}int main(){ string in1,in2; while(cin>>in1>>in2){ cout<<disString(in1,in2)<<endl; }}
34.火车进站问题
#include<iostream>#include<vector>#include<stack>#include<algorithm>#include<sstream>using namespace std;void Sol(vector<int> in,stack<int> sk,vector<int> vec,int index,vector<vector<int>>& RES){ for(int i=sk.size();i>=0;--i) { stack<int> stmp(sk); vector<int> vtmp(vec); for(int j=1;j<=i;++j) { int tmp=stmp.top(); stmp.pop(); vtmp.push_back(tmp); } stmp.push(in[index]); if(in.size()-1==index) { vector<int> res(vtmp); while(!stmp.empty()) { res.push_back(stmp.top()); stmp.pop(); } RES.push_back(res); } else Sol(in,stmp,vtmp,index+1,RES); } }vector<int> toI(string in){ vector<int> res; for(int i=0;i<in.size();++i) { stringstream ss; ss<<in[i]; int tmp; ss>>tmp; res.push_back(tmp); } return res;}string toS(vector<int> vec){ string res; for(int i=0;i<vec.size();++i) { stringstream ss; ss<<vec[i]; string tmp; ss>>tmp; res+=tmp; } return res;}vector<vector<int>> handle(vector<vector<int>> in){ vector<vector<int>> res; vector<string> res1; for(int i=0;i<in.size();++i) { string tmp=toS(in[i]); res1.push_back(tmp); } sort(res1.begin(),res1.end()); for(int i=0;i<res1.size();++i) { vector<int> tmp=toI(res1[i]); res.push_back(tmp); } return res;}int main(){ int n; while(cin>>n) { vector<int> in; stack<int> sk; vector<int> vec; vector<vector<int>> RES; for(int i=0;i<n;i++) { int tmp; cin>>tmp; in.push_back(tmp); } Sol(in,sk,vec,0,RES); RES=handle(RES); for(int i=0;i<RES.size();i++) { for(int j=0;j<RES[i].size();j++) { if(j==RES[i].size()-1) cout<<RES[i][j]; else cout<<RES[i][j]<<" "; } cout<<endl; } }}
2 1
- 华为机试--牛客刷题
- 华为机试
- 华为机试
- 华为机试
- 华为机试
- 华为机试4
- 华为机试
- 华为机试
- 华为机试-2014
- 华为机试
- 华为机试2014
- 华为机试
- 华为机试
- 华为机试整理
- 2014华为机试
- 历年华为机试
- 华为机试---最小公倍数
- 华为机试---打渔晒网
- ThinkPHP_5.0版本的笔记
- Drools6 术语介绍
- 游戏引擎
- 循环结构:while循环
- Android开发之使用阿里百川即时通讯客服简介
- 华为机试--牛客刷题
- 欢迎使用CSDN-markdown编辑器
- mysql查询日期
- ubuntu彻底干净卸载MySQL、Apache2、Php的方法
- RMI介绍
- java中Class对象详解
- Kestrel队列使用示例[配置、安装、命令]
- 链接数据库的方法
- 关于abiFilters的使用