Tencent テスト開発インタビューの質問

ああ、今日、Tencent のテスト開発エンジニアにインタビューしたところ、顔が腫れていました. 情報を調べて、インタビューの質問について話すために降りてきました
.法律]

たとえば、14533254 の文字列が O(N) 時間だけ必要な場合、1 サイクルしか通過できず、小学校で習った 3 で割り切れる数の法則に従って、すべての数は割り切れます。これを使って計算します。

アイデアは、数字を順番に追加して配列を取得し、次に上記の 14533254 の文字列を追加すると、配列は {1,5,10,13,16,18,23,27} になり、各数字は3, {1,2,1,1,1,0,2,0} となり、sum0(余り0の数)=2、sum1(余り1の数)=4、sum2を求める(剰余2の数)=2、計算結果はres=sum0+C(sum0,2)+C(sum1,2)+C(sum2,2); C(sum0,2)は
組み合わせ数値の問題です。例として C(sum1,2) を取り上げて説明します

C(sum1,2) は、sum1 の数の 2 つの {1, 145, 1453, 14533} をランダムに選択し、2 つを選択して左から右に同じものを削除することを意味し、ボディの下の部分は 3 で割り切れる必要があります; コードを
示す以下のように:

#include<iostream>
#include<string>
#include<algorithm>

using namespace std;
int main()
{
	string str;
	while (cin >> str)
	{
		int len = str.length();
		
		int sum = 0;
		int sum0 = 0, sum1 = 0, sum2 = 0;
		for (int i = 0; i < len; i++)
		{
			sum += str[i] - '0';
			
			if (sum%3== 0)
				sum0++;
			else
				if (sum % 3 == 1)
					sum1++;
				else
					sum2++;
		}
		
		cout << "结果是:"<<sum0 + sum0 * (sum0 - 1) / 2 + sum1 * (sum1 - 1) / 2 + sum2 * (sum2 - 1) / 2 << endl;
	}
	return 0;
}

参考:https://www.cnblogs.com/zhazhaacmer/p/9441372.html

おすすめ

転載: blog.csdn.net/qq_41841073/article/details/82889982