华为OJ算法题(一)
来源:互联网 发布:软件开发员工保密协议 编辑:程序博客网 时间:2024/06/15 15:06
1、火车进站
class train_station{public:void get_result() { int num=0; int tem=0; cin>>num; int size=num; while(size--) { cin>>tem; numbers.push_back(tem); ///保存进站顺序 } _partion(numbers,numbers.begin()); //排列组合 sort(re.begin(),re.end()); //找出符合要求的 for(size_t i=0;i<re.size();i++) { if(_is_true(re[i],numbers,numbers.size())) { for(size_t j=0;j<re[i].size();j++) { cout<<re[i][j]; if((j<re[i].size()-1)) cout<<" "; } cout<<endl; } } } private:void _partion(vector<int> &str,vector<int>::iterator begin) //排列组合 注意必须是向量的引用,不然会出现迭代器失效的问题{if(begin==str.end()){re.push_back(str);}else{for(vector<int>::iterator i=begin;i!=str.end();i++){int tem=*i;*i=*begin;*begin=tem; _partion(str,begin+1); tem=*i;*i=*begin;*begin=tem;}}}bool _is_true(vector<int> &popstr,vector<int> &pushstr,int length) //判断该组合是否是火车的正确出栈顺序{//numbers是入站序列,str是出站序列if(popstr.empty()||pushstr.empty()||length<=0) return false; vector<int>::iterator popOrder=popstr.begin();vector<int>::iterator pushOrder=pushstr.begin(); int i=0,j=0; for(;;) { if(!s1.empty()&&j<length&&popstr[j]==s1.top()) //防止地址访问出界 { j++; s1.pop(); } if(s1.empty()||(popstr[j]!=s1.top())) { if(i>=length||j>=length) break; s1.push(pushstr[i]); i++; } }while(!s1.empty()) //把栈清空{s1.pop();} if(i==length&&j==length) return true; else return false;}private:vector<int> numbers; //保存输入数据vector<vector<int>> re; //保存所有的排列组合stack<int> s1;};2、比较两手牌的大小
class comp{public:void start(){string str;vector<char> one;vector<char> two;while(getline(cin,str)){size_t i=0;while(str[i]!='-'){if(str[i]!=' ')one.push_back(str[i]);i++;}i++;while(i<str.size()){if(str[i]!=' ')two.push_back(str[i]);i++;}//判断哪个序列大vector<char> result=_large_str(one,two);//输出if(have_joker(result)&&result.size()==10){if(result[1]=='o')cout<<"joker JOKER"<<endl;else cout<<"JOKER joker"<<endl;}else if(have_joker(result)&&result.size()==5){if(result[1]=='o')cout<<"joker"<<endl;else cout<<"JOKER"<<endl;}else{for(size_t i=0;i<result.size();i++){if(result[i]=='1'){cout<<result[i];continue;}if(i<result.size()-1)cout<<result[i]<<" ";elsecout<<result[i];}cout<<endl;}//清空向量result.clear();one.clear();two.clear();}}private:vector<char> _large_str(vector<char> one,vector<char> two){if(have_joker(one)&&one.size()==10) //有王炸直接输出王炸的向量return one;else if(have_joker(two)&&two.size()==10) //有王炸直接输出王炸的向量return two;else if(have_joker(one)&&two.size()==1) //只有一个王的比较return one;else if(have_joker(two)&&one.size()==1) //只有一个王的比较return two;else if(have_joker(one)&&have_joker(two)) //两个大小王比较{if(one[0]=='J')return one;else return two;}//如果没有王,则正常比较if(!have_joker(one)&&!have_joker(two)){//都没有王时,炸弹最大if(one.size()==4&&two.size()!=4){//考虑4个10的情况if(two.size()==8){if(get_value(one[0])>10)return one;elsereturn two;}return one;}else if(one.size()!=4&&two.size()==4){//考虑4个10的情况if(one.size()==8){if(get_value(two[0])>10)return two;elsereturn one;}return two;}else{int one_value=get_value(one[0]);int two_value=get_value(two[0]);if(one_value>two_value)return one;else return two;}}return vector<char>(); //返回一个临时向量}bool have_joker(vector<char> &one){if(one.size()>=5)if(one[1]=='o'||one[1]=='O')return true;else return false;elsereturn false;}int get_value(char c){if(c=='J')return 11;else if(c=='Q')return 12;else if(c=='K')return 13;else if(c=='A')return 14;else if(c=='2')return 15;else{if(c=='1')return 10;return c-'0';}}};3、字符串去重
class str_solution{public:void start(){string str;bool flag[128]={false};while(true){cin>>str;for(int i=0;i<str.size();i++){if(flag[str[i]]==true){copy(str.begin()+i+1,str.end(),str.begin()+i);str[str.size()-1]='\0';if(str[i]!='\0')i--;}elseflag[str[i]]=true;}cout<<str<<endl;memset(flag,false,128);}}};4、坐标移动
class axis_move{public:axis_move(){x_start=0;y_start=0;}void start(){string str;int sum=0;while(getline(cin,str)){for(int i=0;i<str.size();i++){switch(str[i]){case 'A': //左移i++;while(str[i]!=';'){if(str[i]>='0'&&str[i]<='9'){sum=sum*10+str[i]-'0';i++;}else if(str[i]==' '){i++;}else{while(str[i]!=';'){i++;}sum=0;}}if(sum!=0){x_start-=sum;sum=0;}break;case 'D': //左移i++;while(str[i]!=';'){if(str[i]>='0'&&str[i]<='9'){sum=sum*10+str[i]-'0';i++;}else if(str[i]==' '){i++;}else{while(str[i]!=';'){i++;}sum=0;}}if(sum!=0){x_start+=sum;sum=0;}break;case 'W': //左移i++;while(str[i]!=';'){if(str[i]>='0'&&str[i]<='9'){sum=sum*10+str[i]-'0';i++;}else if(str[i]==' '){i++;}else{while(str[i]!=';'){i++;}sum=0;}}if(sum!=0){y_start+=sum;sum=0;}break;case 'S': //左移i++;while(str[i]!=';'){if(str[i]>='0'&&str[i]<='9'){sum=sum*10+str[i]-'0';i++;}else if(str[i]==' '){i++;}else{while(str[i]!=';'){i++;}sum=0;}}if(sum!=0){y_start-=sum;sum=0;}break;default:while(str[i]!=';')i++;break;}}cout<<x_start<<" "<<y_start<<endl;}}private:int x_start;int y_start;};
0 0
- 华为OJ算法题(一)
- 华为OJ(一)
- 华为OJ训练题(一)
- 华为OJ 高级题(一) 铁路栈问题
- 华为OJ相关算法
- 华为OJ机试训练(一)
- 华为OJ训练一
- 【华为OJ】【算法总篇章】
- 华为OJ(二)
- 华为OJ(三)
- 华为OJ(合唱队)
- 华为OJ(四)
- 华为OJ(百钱买百鸡)
- 华为OJ(记负均正)
- 华为OJ(四则运算)
- 华为OJ(线性插值)
- 华为OJ(笔画)
- 华为OJ(四)
- 按钮标题加下划线
- html5内联SVG——<path>标签
- 关于枚举的一个小问题:Syntax error on token "enum", interface expected
- UE4实现向鼠标点击处发射射线
- 分配排序
- 华为OJ算法题(一)
- 开发工具
- zepto获取option的值
- 模拟器安装apk错误解决:The currently selected variant "debug" uses split APKs, but none of the 1 split apks...
- 命令-ln
- 【oracle学习】1.子查询
- 差分约束系统
- 简单说说Spring Security 使用(附加验证码登录,自定义认证)
- SwipeRefreshLayout加listview下拉加载,上拉刷新