c++華為面接問題--牛客網-2.0

17867 ワード

今はまだ研究していますが、プロジェクトのほかに面接問題をする必要があると感じています.どう言えば、基礎を固めることができます.結局、自分の仕事はアルゴリズムに偏っているかもしれませんが、気づかないところがあります.
はい、この問題を見てみましょう.
説明:
整数を入力し、この整数を文字列の形式で逆順序で出力します.
プログラムは負数を考慮せず,数値が0を含むと逆順形式も0を含み,入力が100であれば出力は001である.
この問題はとても簡単ですね.大学1年生のc言語には非常に基礎があります.ブロガーの参考コードを見てみましょう.
#include
using namespace std;

int main()
{
	int num;
	cin >> num;
	while (num)
	{
		int a = num % 10;
		num = num / 10;
		cout << a;
	}
	return 0;
}

もう一つの問題は、プログラムを書いて文字列を受け入れ、その文字列が反転した文字列を出力する簡単な基礎問題です.
ブロガーリファレンスコード:
#include
#include

using namespace std;

int main()
{
    string str;
    cin>>str;
    for(int i=0;i

 
もう一つ、今日のプロジェクトはまだ協議していることがあります.タイトル:英語の文を単語単位で逆順に排出します.
この問題の構想は,まず一連の単語を得てから逆順に出力すればよいということである.ブロガーリファレンスコード:
#include
#include
#include
using namespace std;

int main()
{
	string str;
	string cur;
	vector vec;
	getline(cin, str);
	for (int i = 0; i<=str.size(); i++)
	{
		if (str[i]!=' '&&i=0; i--)
	{
		if (i == 0)
		{
			cout << vec[i];
		}
		else
		{
			cout << vec[i] << " ";
		}
	}
	return 0;
}

次の問題を見てみましょう.
           n(1≤n≤1000),  n  n    (     ≤100),            。
    n ,                。

この問題はstrcmpで比較したのですが、stringを使っているのでc_を使いました.str()このstringはconst char*関数を回転しますが、牛客網コンパイラが間違っていて、vs 2015でデバッグしても問題ありません.もちろんもっと簡単なsortも使えます.次の2つの方法を示します.
#include
#include
#include
using namespace std;

int main()
{
	int num;
	cin >> num;
	vector vec;
	for (int i = 0; i < num; i++)
	{
		string a;
		cin >> a;
		vec.push_back(a);
	}
	for (int i = 0; i < vec.size()-1; i++)
		for (int j = i; j < vec.size()-1; j++)
		{
			int res=strcmp(vec[j].c_str(), vec[j+1].c_str());
			if (res > 0)
			{
				string cur;
				cur = vec[j];
				vec[j] = vec[j + 1];
				vec[j + 1] = cur;
			}
		}
	for (int i = 0; i < vec.size(); i++)
	{
		cout << vec[i] << endl;
	}
	return 0;
}
#include
#include
#include
#include
using namespace std;

int main()
{
	int num;
	cin >> num;
	vector vec;
	for (int i = 0; i < num; i++)
	{
		string a;
		cin >> a;
		vec.push_back(a);
	}
	sort(vec.begin(),vec.end());
	for (int i = 0; i < vec.size(); i++)
	{
		cout << vec[i] << endl;
	}
	return 0;
}

バイナリ変換のテーマ:int型の正の整数を入力し、そのint型データがメモリに格納されているときの1の個数を算出します.正の整数であるため、比較的簡単で、絶えず/2と余剰を取ればいいだけで、余剰はそれぞれ逆順にバイナリ数を得ることができます.参照コードを見てみましょう.
#include
using namespace std;

int main()
{
    int num;
    cin>>num;
    int n=0
    while(num)
    {
        if(num%2)
        {
            n++
        }
        num=num/2;
    }
    cout<

問題を見てみましょう.
パスワードの要件
1.長さが8ビットを超える
2.大文字と小文字を含む.数字その他の記号、以上の4種類の少なくとも3種類
3.同じ長さが2を超えるサブストリングを繰り返してはいけない
説明:長さが2を超えるサブストリング
要求通り出力:OK、そうでなければNG
参照コードは次のとおりです.
#include
#include
#include
using namespace std;




int main()
{
	string str;
	vector vec;
	while (cin>>str)
	{
		if (str.size() <= 8)
		{
			cout << "NG" << endl;
			continue;
		}
		int a = 0, b = 0, c = 0, d = 0;
		for (int i = 0; i < str.size(); i++)
		{
			if (str[i] >= '0'&&str[i] <= '9')
			{
				a = 1;
			}
			else if (str[i] >= 'a'&&str[i] <= 'z')
			{
				b = 1;
			}
			else if (str[i] >= 'A'&&str[i] <= 'Z')
			{
				c = 1;
			}
			else
			{
				d = 1;
			}
		}
		if ((a + b + c + d) >= 3)
		{
			//
		}
		else
		{
			cout << "NG" << endl;
			continue;
		}
		int count = 0;
		for (int i = 0; i < str.size() - 6; i++)
			for (int j = i+3; j < str.size() - 3; j++)
			{
				if (str[i] == str[j] && str[i + 1] == str[j + 1] && str[i + 2] == str[j + 2])
				{
					count = 1;
				}
			}
		if (count == 1)
		{
			cout << "NG" << endl;
			continue;
		}
		else
		{
			cout << "OK" << endl;
			continue;
		}
	}
	return 0;
}

もう1題やりましょう.のああ、前にいくつかの問題ができませんでした.の
パスワードは私たちの生活の中で非常に重要なもので、私たちのそんな少しも言えない秘密はすべてそれに頼っています.わあははは.次に淵子はパスワードの上にパスワードを追加しなければならない.簡単だが安全だ.
もし淵子の元のBBSのパスワードがzvbo 9441987だったとしたら、記憶を便利にするために、彼はアルゴリズムを通じてこのパスワードをYUANzhi 1987に変換した.このパスワードは彼の名前と生年で、どのように忘れても忘れられないし、人目につく場所に置いて本当のパスワードを知られないことができる.
彼はこのように変換して、みんなはすべて携帯電話の上のアルファベットを知っています:1--1、abc-2、def--3、ghi--4、jkl--5、mno--6、pqrs--7、tuv--8 wxyz--9、0--0、このように簡単で、淵子はパスワードの中で現れた小文字をすべて対応する数字に変えて、数字とその他の記号はすべて変換しません.
声明:パスワードにはスペースがありませんが、パスワードに出てくる大文字は小文字になってから1つ後ろに移動します.例えば、X、まず小文字になってから、もう1つ後ろに移動します.yではありませんか.簡単でしょう.覚えておいて、zが後ろに移動するのはaですよ.
淵子の真の密文を出力する
サンプルコード:
#include
#include
using namespace std;




int main()
{
	string str;
	string str1;
	cin >> str;
	for (int i = 0; i < str.size(); i++)
	{
		if (str[i] >= '0'&&str[i] <= '9')
		{
			str1 += str[i];
		}
		else if (str[i] >= 'A'&&str[i] <= 'Z')
		{
			int num = int(str[i]) + 32 + 1;
			if (int(str[i]) == 90)
			{
				num = 97;
			}
			str1 += char(num);
		}
		else if (str[i] >= 'a'&&str[i] <= 'z')
		{
			if (str[i] >= 'a'&&str[i] <= 'c')
			{
				str1 += '2';
			}
			else if (str[i] >= 'd'&&str[i] <= 'f')
			{
				str1 += '3';
			}
			else if (str[i] >= 'g'&&str[i] <= 'i')
			{
				str1 += '4';
			}
			else if (str[i] >= 'j'&&str[i] <= 'l')
			{
				str1 += '5';
			}
			else if (str[i] >= 'm'&&str[i] <= 'o')
			{
				str1 += '6';
			}
			else if (str[i] >= 'p'&&str[i] <= 's')
			{
				str1 += '7';
			}
			else if (str[i] >= 't'&&str[i] <= 'v')
			{
				str1 += '8';
			}
			else if (str[i] >= 'w'&&str[i] <= 'z')
			{
				str1 += '9';
			}
		}
		else
		{
			str1 += str[i];
		}
	}
	cout << str1 << endl;
	return 0;
}

 
はい、退屈でもう1題来て、毎日問題を塗って本を読むのは面白いと思います.ある店では、空のサイダーを3本と交換できると規定されています.張さんは手に10本の空のサイダーを持っていますが、彼女はせいぜい何本のサイダーを交換して飲むことができますか.答えは5本で、方法は以下の通りです:まず9つの空き瓶で3本のサイダーを交換して、3本の満タンを飲んで、飲んでから4つの空き瓶を飲んで、3つでもう1本交換して、この満タンを飲んで、この時2つの空き瓶が残っています.それから、社長にまずサイダーを貸してもらい、この瓶をいっぱい飲んで、飲んでから3つの空き瓶でいっぱいのものを交換して社長に返します.もし張さんの手にn個の空きサイダーがあれば、せいぜいサイダーを何本交換して飲むことができますか.
入力ファイルには最大10組のテストデータが含まれており、各データは1行を占め、正の整数n(1<=n<=100)のみが含まれており、張さんが手に持っている空きペットボトルの数を示している.n=0は入力が終了したことを示し、あなたのプログラムはこの行を処理すべきではありません.
各グループのテストデータについて、1行出力し、最大飲めるサイダーボトル数を示す.1本も飲めない場合は、0を出力します.
この問題は難しくないから、少なくとも2つの瓶の蓋をつかんで水を1本交換すればいい.
#include
using namespace std;




int main()
{
	int num;
	while (cin >> num)
	{
		if (num == 0)
		{
			break;
		}
		int bottle = 0;
		while (num >= 3)
		{
			int none = num / 3;
			bottle +=none;
			num = none + num % 3;
		}
		if (num == 2)
		{
			bottle++;
		}
		cout << bottle << endl;
	}
	return 0;
}

毎日いくつかの問題を練習します:文字列の中で最も出現回数の少ない文字を削除することを実現して、もし複数の文字が出現回数が同じならば、すべて削除します.これらの単語を削除した文字列を出力し、文字列内の他の文字は元の順序を維持します.  
私の理解は、各要素の個数をループして検索し、最小の除去を探していることです.
参照コードを見てみましょう.
#include
#include
#include
using namespace std;




int main()
{
	string str;
	while (cin >> str)
	{
		vector vec;
		for (int i = 0; i < str.size(); i++)
		{
			int num = 0;
			for (int j = 0; j < str.size(); j++)
			{
				if (str[i] == str[j])
				{
					num++;
				}
			}
			vec.push_back(num);
		}
		//         
		int min = 100;
		for (int i = 0; i < vec.size(); i++)
		{
			if (vec[i] < min)
			{
				min = vec[i];
			}
		}
		string res;
		for (int i = 0; i < str.size(); i++)
		{
			if (min != vec[i])
			{
				res += str[i];
			}
		}
		cout << res << endl;
	}
	return 0;
}

 
もう一つ質問します.
入力文字列の文字を次のルールでソートするプログラムを作成します.
ルール1:アルファベットはAからZまで並べ、大文字と小文字を区別しない.
例えば、入力:Type出力:epType
ルール2:同じ英字の大文字と小文字が同時に存在する場合は、入力順に並べます.
例えば、入力:BabA出力:aABb
ルール3:英語以外の文字は元の位置を維持します.
例えば、入力:By?e出力:Be?y
ブロガーリファレンスコード:
#include
#include
using namespace std;



int main()
{
	string str;
	while (getline(cin, str))
	{
		string str1;
		//  26         
		for (int i = 0; i < 26; i++)
			for (int j = 0; j < str.size(); j++)
			{
				if ((str[j] >= 'A'&&str[j] <= 'Z') || (str[j] >= 'a'&&str[j] <= 'z'))
				{
					if (str[j] - 'a' == i || str[j] - 'A' == i)
					{
						str1 += str[j];
					}
				}
			}
		int m = 0;
		for (int i = 0; i < str.size(); i++)
		{
			if ((str[i] >= 'A'&&str[i] <= 'Z') || (str[i] >= 'a'&&str[i] <= 'z'))
			{
				str[i] = str1[m];
				m++;
			}
		}
		cout << str << endl;
	}
	return 0;
}

もう一つ質問しましょう.今日はブロガーが熱があります.これからは996しないほうがいいと思います.ああ.
テーマを見てみましょう.
1、入力した文字列を復号し、出力する.
2暗号化方法:
内容が英語のアルファベットである場合、その英語のアルファベットの後のアルファベットで置換し、同時にアルファベットは大文字と小文字を変換し、アルファベットaの場合、Bに置換する.アルファベットZの場合はaに置き換えます.
内容が数字である場合、この数字に1を加え、0が1を置き換え、1が2を置き換え、9が0を置き換える.
他の文字は変更されません.
3、復号方法は暗号化の逆過程である.問題は難しくないですね.状況ごとに正しく処理すればいいです.
#include
#include
using namespace std;



int main()
{
	string str1,str2;
	while (getline(cin, str1))
	{
		getline(cin, str2);
		string str1_1, str2_2;
		for (int i = 0; i < str1.size(); i++)
		{
			if (str1[i] >= 'a'&&str1[i] <= 'z')
			{
				if (str1[i] != 'z')
				{
					str1_1 += str1[i] - 31;
				}
				else
				{
					str1_1 += 'A';
				}
			}
			else if (str1[i] >= 'A'&&str1[i] <= 'Z')
			{
				if (str1[i] != 'Z')
				{
					str1_1 += str1[i] + 33;
				}
				else
				{
					str1_1 += 'a';
				}
			}
			else if (str1[i] >= '0'&&str1[i] <= '9')
			{
				if (str1[i] != '9')
				{
					str1_1 += str1[i] + 1;
				}
				else
				{
					str1_1 += '0';
				}
			}
			else
			{
				str1_1 += str1[i];
			}
		}

		//
		for (int i = 0; i < str2.size(); i++)
		{
			if (str2[i] >= 'a'&&str2[i] <= 'z')
			{
				if (str2[i] != 'a')
				{
					str2_2 += str2[i] - 33;
				}
				else
				{
					str2_2 += 'Z';
				}
			}
			else if (str2[i] >= 'A'&&str2[i] <= 'Z')
			{
				if (str2[i] != 'A')
				{
					str2_2 += str2[i] + 31;
				}
				else
				{
					str2_2 += 'z';
				}
			}
			else if (str2[i] >= '0'&&str2[i] <= '9')
			{
				if (str2[i] != '0')
				{
					str2_2 += str2[i] - 1;
				}
				else
				{
					str2_2 += '9';
				}
			}
			else
			{
				str2_2 += str2[i];
			}
		}
		cout << str1_1 << endl;
		cout << str2_2 << endl;
	}
	
	return 0;
}

ツッコミを入れて、風邪は本当につらくて熱がありますね.
Lilyは授業中にアルファベットの数字の画像を使って子供たちに英語の単語を教えて、毎回これらの画像を大きさ(ASCIIコードの値が小さいから大きい)に並べて収める必要があります.Lilyさんに手伝ってもらい、C言語で解決してください.
シンプルでクラシックな泡でソートできます
#include
#include
using namespace std;



int main()
{
	string str;
	while (getline(cin, str))
	{
		for (int i = 0; i < str.size() - 1; i++)
			for (int j = 0; j < str.size() - 1; j++)
			{
				if ((str[j]) >(str[j + 1]))
				{
					char tem = str[j + 1];
					str[j + 1] = str[j];
					str[j] = tem;
				}
			}

		cout << str << endl;
	}
	
	return 0;
}

タイトルの説明
蛇行行列は、1から始まる自然数が順次配列された行列上の三角形である.
サンプル入力
5
サンプル出力
1 3 6 10 15
2 5 9 14
4 8 13
7 12
11
この問題は法則を見つければいいので、コードを見ることはありません.
#include
using namespace std;




int main()
{
	int num;
	while (cin >> num)
	{
		int n = 1;
		for (int i = 1; i <= num; i++)
		{
			n = n + i - 1;
			int sum = n;
			//      
			int col = i + 1;
			if (i != num)
			{
				cout << n << " ";
			}
			else
			{
				cout << n << endl;
			}
			for (int j = num - i; j >= 1; j--)
			{
				if (j != 1)
				{
					cout << sum + col << " ";
					sum = sum + col;
					col += 1;
				}
				else
				{
					cout << sum + col << endl;
				}
			}
		}
	}
	return 0;
}

もう1題見てみろ
データを暗号化するテクニックがあり、スプーンとして単語を使用します.次に、その動作原理を示します.まず、TRAILBLaZERSのような単語をスプーンとして選択します.単語に重複するアルファベットが含まれている場合は、1番目だけを残し、残りのいくつかは破棄します.現在、修正された単語はアルファベットの下にあり、以下のようになります.
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
T R A I L B Z E S C D F G H J K M N O P Q U V W X Y
上の他の文字はアルファベットの残りの文字で完全に埋め込まれています.情報を暗号化する場合、情報の各アルファベットは上の行に固定され、次の行の対応するアルファベットで原文のアルファベットに置き換えられます(アルファベット文字の大文字と小文字の状態は保持されます).そのため、このスプーンを使用すると、アタックAT DAWNはTpptad TP ITVHに暗号化されます
コードを見てみましょう.
#include
#include
using namespace std;




int main()
{
	string str, str1,str2,str3,str4;
	while (getline(cin, str))
	{
		str2.clear();
		str3.clear();
		str4.clear();
		getline(cin, str1);
		//      
		str2 += str[0];
		for (int i = 1; i < str.size(); i++)
		{
			str2.push_back(str[i]);
			for (int j = 0; j < i; j++)
			{
				if (str[i] >= 'A'&&str[i] <= 'Z'&&str[j] >= 'A'&&str[j] <= 'Z'&&str[i] == str[j])
				{
					str2.pop_back();
					break;
				}
				else if (str[i] >= 'A'&&str[i] <= 'Z'&&str[j] >= 'a'&&str[j] <= 'z'&&str[i] + 32 == str[j])
				{
					str2.pop_back();
					break;
				}
				else if (str[i] >= 'a'&&str[i] <= 'z'&&str[j] >= 'a'&&str[j] <= 'z'&&str[i] == str[j])
				{
					str2.pop_back();
					break;
				}
				else if (str[i] >= 'a'&&str[i] <= 'z'&&str[j] >= 'A'&&str[j] <= 'Z'&&str[i] - 32 == str[j])
				{
					str2.pop_back();
					break;
				}
			}
		}
		for (char a = 'A'; a <= 'Z'; a++)
		{
			str2.push_back(a);
			for (int i = 0; i < str2.size()-1 ; i++)
			{
				if (str2[i] >= 'A'&&str2[i] <= 'Z'&&str2[i] == a)
				{
					str2.pop_back();
					break;
				}
				else if (str2[i] >= 'a'&&str2[i] <= 'z'&&str2[i] - 32 == a)
				{
					str2.pop_back();
					break;
				}
			}
		}
		for (int i = 0; i < str1.size(); i++)
		{
			if (str1[i] >= 'A'&&str1[i] <= 'Z')
			{
				int n = str1[i] - 'A';
				if (str2[n] >= 'A'&&str2[n] <= 'Z')
				{
					str3.push_back(str2[n]);
				}
				else
				{
					str3.push_back(str2[n] - 32);
				}

			}
			else
			{
				int n = str1[i] - 'a';
				if (str2[n] >= 'A'&&str2[n] <= 'Z')
				{
					str3.push_back(str2[n] + 32);
				}
				else
				{
					str3.push_back(str2[n]);
				}
			}
		}
		cout << str3 << endl;
	}
	return 0;
}

还有,需要问一下ウサギは生まれて3ヶ月目から毎月すべて1匹のウサギを生んで、小さいウサギは第3ヶ月まで成長した後に毎月また1匹のウサギを生んで、もしウサギはすべて死なないならば、毎月のウサギの総数を聞いていくらですか?これがフィボナッチ数列が追加したものを先月の数と見なしているのです
コードを見てみましょう.
#include
using namespace std;

//                             (     )
int n;
int sum(int mon)
{
	if (mon == 1 || mon == 2)
	{
		n = 1;
	}
	else
	{
		n = sum(mon - 1) + sum(mon - 2);
	}
	return n;
}


int main()
{
	int num;
	while (cin >> num)
	{
		cout << sum(num) << endl;
	}
	return 0;
}

もう一つの問題は、1つのボールが任意の高さから自由に落ちたと仮定し、着地するたびに元の高さの半分に跳ね返った.更に落ちて、それが第5回が着地する時を求めて、共に何メートルを経験しますか?5回目のリバウンドはどれくらいですか?これ...参照コードを見て
#include
using namespace std;


int main()
{
	double num;
	while (cin >> num)
	{
		double sum = 0;
		int n = 5;
		while (n)
		{
			sum += num + num / 2;
			num = num / 2;
			n--;
		}
		sum -= num;
		cout << sum << endl;
		cout << num << endl;
	}
	return 0;
}

もう1つの問題は、簡単です.1行の文字を入力し、英語のアルファベット、スペース、数字、その他の文字を含む個数を統計します.
#include
#include
using namespace std;


int main()
{
	string str;
	while (getline(cin, str))
	{
		int a = 0, b = 0, c = 0, d = 0;
		for (int i = 0; i < str.size(); i++)
		{
			if (str[i] >= 'A'&&str[i] <= 'Z')
			{
				a++;
			}
			else if (str[i] >= 'a'&&str[i] <= 'z')
			{
				a++;
			}
			else if (str[i] == ' ')
			{
				b++;
			}
			else if (str[i] >= '0'&&str[i] <= '9')
			{
				c++;
			}
			else
			{
				d++;
			}
		}
		cout << a << endl;
		cout << b << endl;
		cout << c << endl;
		cout << d << endl;
	}
	return 0;
}