ファーウェイ試験の難しい問題

10869 ワード

問題の説明:   コンピュータでは、プロセッサビット幅の制限により、32ビット幅プロセッサコンピュータなど、限られた精度の10進数整数加算減算法しか処理できない. 演算に関与する操作数と結果は、−231~231−1の間でなければならない.より広い範囲の10進数整数加算が必要な場合は、特殊な 文字列を使用してオペランドと結果を保存し、ビット単位で演算するなどの方法で実現されます.9876543210 + 1234567890 = ? 文字列 num 1="9876543210",文字列 num 2=「1234567890」で、結果は文字列に保存されます. result = "11111111100". -9876543210 + (-1234567890) = ? 文字列 num 1="-9876543210",文字列 num 2="-1234567890"で、結果は文字列に保存されます. result = "-11111111100".  上記の高精度の10進数加算をプログラミングで実現することが要求される. 要求実装関数:   void add (const char *num1, const char *num2, char *result)  【入力】num 1:文字列形式オペランド1、オペランドが負の場合num 1[0]はシンボルビット'-' num 2:文字列形式のオペランド2、オペランドが負の場合num 2[0]はシンボルビット'-' 【出力】result:加算結果文字列を保存し、結果が負の場合はresult[0]がシンボルビットとなります. 注:I、   入力が正数の場合、'+'は入力文字列に表示されません.入力が負数の場合、'-'は入力文字列に表示され、入力文字列の一番左に表示されます. II、  入力文字列のすべてのビットは有効な数字を表します.すなわち、「0012」などの「0」から始まる入力文字列は存在しません. 「-0012」は現れません. III、 出力文字列のすべてのビットが有効な数字であることが要求され、結果が正または0の場合'+'は出力文字列に現れず、結果が負の場合出力文字列の一番左の位置は'-'である.
#include<iostream>
#include<string>
using namespace std;
int compare(string &num1,string &num2);
string &add(string &num1,string &num2,string &result);
string &minu(string &num1,string &num2,string &result);
int main()
{  
	string num1,num2,result,temp;
	while(cin>>num1>>num2) {
		if(num1[0]=='-'&&num2[0]=='-') {
			num1.erase(0,1);
			num2.erase(0,1);
			result.push_back('-');
			add(num1,num2,result);
		}
		else if((num1[0]!='-'&&num2[0]=='-')||(num1[0]=='-'&&num2[0]!='-')) {
			if(num2[0]=='-')
				num2.erase(0,1);
			else
				num1.erase(0,1);
			int m=compare(num1,num2);
			if(m==0){
				result.push_back('-');
				minu(num2,num1,result);
			}
			else if(m==1)
				minu(num1,num2,result);
			else 
				result.push_back('0');
		}
		else
			add(num1,num2,result);
		cout<<result<<endl;
		result="";
	}
	return 0;	
}
int compare(string &num1,string &num2)                        //       
{
	if(num1.size()<num2.size())
		return 0;
	else if(num1.size()>num2.size())
		return 1;
	else
	{
		for(int i=0;i<num1.size();i++)
		{
			if(num1[i]<num2[i])
				return 0;
			else if(num1[i]>num2[i])
				return 1;
		}
		return 3;
	}
}
string &add(string &num1,string &num2,string &result)
{
	string temp;
	int m1=num1.size();
	int m2=num2.size();
	int m=m1>=m2?m2:m1;
	int flag=0,num;
	for(int i=0;i<m1&&i<m2;i++) {
		num=(num1[m1-1-i]-'0')+(num2[m2-1-i]-'0')+flag;
		if(num>=10) {
			flag=1;
			temp.push_back(num%10+'0');
		}
		else {
			temp.push_back(num+'0');
			flag=0;
		}
	}
	if(m1>m2) {
		for(int i=m1-1-m;i>=0;i--) {
			num=(num1[i]+'0')+flag;
			if(num>=10) {
				flag=1;
				temp.push_back(num%10+'0');
			}
			else {
				temp.push_back(num+'0');
				flag=0;
			}
		}
	}
	else if(m1==m2) {
		if(flag==1)
			temp.push_back('1');
	}
	else {
		for(int i=m2-1-m;i>=0;i--) {
			num=(num2[i]+'0')+flag;
			if(num>=10) {
				flag=1;
				temp.push_back(num%10+'0');
			}
			else {
				temp.push_back(num+'0');
				flag=0;
			}
		}
	}
	int n=temp.size();
	char c;
	for(int i=0;i<n/2;i++) {
		c=temp[i];
		temp[i]=temp[n-1-i];
		temp[n-1-i]=c;
	}
	result.append(temp);
	return result;
}
string &minu(string &num1,string &num2,string &result)       //num1         num2   !
{
	string temp;
	int m1=num1.size();
	int m2=num2.size();
	int flag=0,num;
	for(int i=0;i<m2;i++)                                         //      
	{
		num=num1[m1-1-i]-num2[m2-1-i]-flag;
		if(num<0)
		{
			flag=1;
			temp.push_back(num+10+'0');
		}
		else
		{
			temp.push_back(num+'0');
			flag=0;
		}

	}
	if(m1>m2)
	{
		for(int i=m1-1-m2;i>=0;i--)
		{
			num=(num1[i]-'0')-flag;
			if(num<0)
			{
				temp.push_back(num+10+'0');
				flag=1;
			}
			else
			{
				temp.push_back(num+'0');
				flag=0;
			}
		}
	}
	int n=temp.size();
	char c;
	for(int i=0;i<n/2;i++)                      
	{
		c=temp[i];
		temp[i]=temp[n-1-i];
		temp[n-1-i]=c;
	}
	int pos=0;                                 //       0
	for(int i=0;i<n;i++)
	{
		if(temp[i]=='0')
			pos++;
		else
			break;
	}
	temp.erase(0,pos);
	result.append(temp);

	return result;
}

Word Maze インターネットの小さなゲームで、アルファベットで表記された食べ物を見つける必要がありますが、与えられた単語のアルファベットの順番で食べるように要求されています.上記の図のように、与えられた単語ifを仮定すると、fを食べる前にiを食べなければなりません. しかし、今のあなたの任務はそんなに簡単ではありません.あなたは今1つの(n×mの行列)では、アルファベットで表記された食べ物があちこちにありますが、与えられた単語Wにつながる食べ物しか食べられません. 以下の図にWを「ソロ」と指定すると、地図に「ソロ」という単語が赤で表記されている. 英語のアルファベットの大文字と小文字を区別することに注意してください.上下左右に歩くしかありません.実行時間の制限:  メモリ制限なし:  無制限入力:入力1行目に2つの整数n、m(0#include<iostream> #include<string> #include<cstdlib> using namespace std; void search(char **p,bool **visit,const string &w,int pos,int n,int m,int s,int e); int main() { int n,m,pos=0; cin>>n>>m; string w; cin>>w; char **p=new char*[n]; bool **visit=new bool*[n]; for(int i=0;i<n;i++) { p[i]=new char[m]; visit[i]=new bool[m]; } for(int i=0;i<n;i++) for(int j=0;j<m;j++) { cin>>p[i][j]; visit[i][j]=false; } for(int i=0;i<n;i++) // ( ) { for(int j=0;j<m;j++) { if(p[i][j]==w[pos]) { visit[i][j]=true; search(p,visit,w,pos+1,n,m,i,j); } } } cout<<"NO"<<endl; for(int i=0;i<n;i++) { delete []p[i]; delete []visit[i]; } return 0; } void search(char **p,bool **visit,const string &w,int pos,int n,int m,int s,int e) { if(pos==w.size()) // x== , { cout<<"YES"<<endl; for(int i=0;i<n;i++) { delete []p[i]; delete []visit[i]; } exit(0); } // if(s-1>=0&&visit[s-1][e]==false&&p[s-1][e]==w[pos]) { visit[s-1][e]=true; search(p,visit,w,pos+1,n,m,s-1,e); } if(e-1>=0&&visit[s][e-1]==false&&p[s][e-1]==w[pos]) { visit[s][e-1]=true; search(p,visit,w,pos+1,n,m,s,e-1); } if(s+1<n&&visit[s+1][e]==false&&p[s+1][e]==w[pos]) { visit[s+1][e]=true; search(p,visit,w,pos+1,n,m,s+1,e); } if(e+1<m&&visit[s][e+1]==false&&p[s][e+1]==w[pos]) { visit[s][e+1]=true; search(p,visit,w,pos+1,n,m,s,e+1); } else return ; }
将 電話番号 one two ...nine ゼロを1に訳す  2 ..9 0
真ん中にdoubleがあります
例えば入力:OneTwoThree出力:123
入力:OneTwoDoubleTwo出力:1222
入力:1 Two 2 出力:ERROR
入力:DoubleDoubleTwo 出力:ERROR
第3題:スペースがあって、不法な文字、2つのDoubleはつながって、Doubleは最後の1つの単語に位置します すべてが間違っている
#include <iostream>
#include <map>
#include <string>
#include <ctype.h>
using namespace std;

int main()
{
	string str;
	while(cin>>str) {
		if(str.find(" ")!=-1)
		{
			cout<<"ERROR"<<endl;
			break;
		}
		if(str.length()>12&&str[str.find("Double")+6]=='D') {
			cout<<"ERROR"<<endl;
			break;
		}
		if(str.length()>6&&str.rfind("Double")==str.length()-6) {
			cout<<"ERROR"<<endl;
			break ;
		}
		for(int i=0;i<str.length();i++) {
			if(isdigit(str[i]))
			{
				cout<<"ERROR"<<endl;
				break;
			}
		}
		int flag=0;
		for(int i=0;i<str.length();) {
			if(str[i]=='O')
			{	
				if(flag==1)
					cout<<"1"<<"1"; 
				else cout<<"1";
				i=i+3;
			}
			else if(str[i]=='T'){
				if(str[i+1]=='h')
				{ 
					if(flag==1)
						cout<<"3"<<"3";
					else cout<<"3";
					i=i+5;
				}
				else {
					if(flag==1)
						cout<<"2"<<"2";
					else cout<<"2";
					i=i+3;
				}
			}
			else if(str[i]=='F') {
				if(str[i+1]=='o'){
					if(flag==1)
						cout<<"4"<<"4";
					else cout<<"4";
				}
				else {
					if(flag==1)
						cout<<"5"<<"5";
					else cout<<"5";
				}
				i=i+4;
			}
			else if(str[i]=='S') {
				if(str[i+1]=='i') {
					if(flag==1)
						cout<<"6"<<"6";
					else cout<<"6";
					i=i+3;
				}
				else {
					if(flag==1)
						cout<<"7"<<"7";
					else cout<<"7";
					i=i+5;
				}
			}
			else if(str[i]=='E') {
				cout<<"8";i=i+5;
			}
			else if(str[i]=='N') {
				if(flag==1)
					cout<<"9"<<"9";
				else cout<<"9";
				i=i+4;
			}
			else if(str[i]=='Z') {
				if(flag==1)
					cout<<"0"<<"0";
				else cout<<"0";
				i=i+4;
			}
			else if(str[i]=='D'){
				i=i+6;
				flag=1;
			}
		}
		cout<<endl;
	}
	return 0;
}

入居できない宿泊客数
タイトルの説明:
       ホテルがあり、m部屋(room)しかなく、宿泊客(A~Z)が来た場合、空き部屋があればすぐにチェックインできます.空き部屋がなければ入居できません.旅客はすぐに離れるか、空き部屋を待つことができます.
各旅客の到着と出発の順序(例えばHFBJJBKFHMMSSLPWWPLK)が与えられたと仮定し、何人の旅客がチェックインできなかったかを聞く. 
要件:
入力:ルーム数  旅客が到着して離れる順番
出力:最終的に泊まれなかった旅客数
サンプル:
入力:3  HFBJJBKFHMMSSLPWWPLK
出力:2
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
vector<char> arraylist;

bool isInRoom(vector<char> arraylist,char user)
{
	 bool temp=false;
	 for(int i=0;i<arraylist.size();i++) {
		 if(user==arraylist.at(i)) {
			 temp=true;
			 break;
		 }
	 }
	 return temp;
}

int main()
{
	int num;
	string users;
	cin>>num;
	cin>>users;

	int result=0;
	for(int i=0;i<users.length();i++) {
		if(isInRoom(arraylist,users[i]))
		{
			vector<char>::iterator iter = find(arraylist.begin(),arraylist.end(),users[i]);
			arraylist.erase(iter);
		}
		else if(arraylist.size()<num) {
			vector<char>::iterator iter = arraylist.end();
			arraylist.insert(iter,users[i]);
		}
		else {
			result++;
			continue;
		}
	}
	cout<<result/2<<endl;
	return 0;
}