ああ、今日、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