NetEase筆記試験

 

目次

網易プログラミングの質問1、回文配列(欲張り法)

網易プログラミングの質問2、エレガントなポイント(カウント)

NetEaseプログラミング問題3、ストーンボードのジャンプ(動的計画法)

NetEaseプログラミングの質問4、暗い文字列(再帰的カウント)

網易プログラミングの質問5、数の反転(計算)

網易プログラミング問題6、最大の奇数(再帰計算)

網易プログラミングの質問7、リンゴを買う(計算)

網易プログラミングの質問8、キャンディーの計算(計算)


網易プログラミングの質問1、回文配列(欲張り法)

 

 

デジタルシーケンスが反転後の元のシーケンスと同じである場合、そのようなデジタルシーケンスはパリンドロームシーケンスと呼ばれます。例:
{1、2、1}、{15、78、78、15}、{112}は回文配列、
{ 1、2、2  }、{15、78、87、51}、{112、 2、11}はパリンドロームシーケンスではありません。
次に、数値のシーケンスを指定して、変換操作を許可し
ます。隣接する2つの数値を選択し、シーケンスからこれら2つの数値を削除して、これら2つの数値の合計を2つの数値の前の位置に挿入します(合計のみを挿入します)。
ここで、指定されたシーケンスに対して、それをパリンドロームシーケンスに変換するために必要な操作の数。

説明を入力してください:

输入为两行,第一行为序列长度n ( 1 ≤ n ≤ 50)
第二行为序列中的n个整数item[i]  (1 ≤ iteam[i] ≤ 1000),以空格分隔。

出力の説明

输出一个数,表示最少需要的转换次数

入力例:

4
1 1 1 3

出力例:

2

私のコード:

#include <iostream>
using namespace std;
 
int main()
{
	int n, list[50], ans = 0, suml = 0, sumr = 0;
	cin >> n;
	for (int i = 0; i < n; i++)cin >> list[i];
	int i = -1, j = n;
	while (i<j)
	{
		if (suml == sumr)
		{
			i++, j--;
			suml = list[i], sumr = list[j];
		}
		else if (suml < sumr)
		{
			i++, ans++;
			suml += list[i];			
		}
		else
		{
			j--, ans++;
			sumr += list[j];			
		}
	}
	cout << ans;
	return 0;
}

 

網易プログラミングの質問2、エレガントなポイント(カウント)

 

Xiaoyiには、中心が座標の原点にある円があり、Xiaoyiは円の半径の2乗を知っています。Xiao Yiは、円上の点と、水平座標と垂直座標が整数である点がエレガントであると考えています。XiaoYiは、エレガントな点の数を計算するアルゴリズムを見つけたいと考えています。彼を助けてください。
例:半径の2乗が25
エレガントポイントの場合、次のようになります:(+/- 3、+ /-4)、(+/- 4、+ /-3)、(0、+ /-5)( +/- 5、0)、合計12ポイント。 

説明を入力してください:

输入为一个整数,即为圆半径的平方,范围在32位int范围内。

出力の説明:

输出为一个整数,即为优雅的点的个数

入力例:

25

出力例:

12

コード:

#include <iostream>
#include<math.h>
using namespace std;
 
bool squ(int n)
{
	int m = (int)sqrt(n);
	return m*m == n;
}
int main()
{
	int n, ans = 0;
	cin >> n;
	for (int i = 1; i*i * 2 < n; i++)if (squ(n - i*i))ans += 8;
	if (n % 2 == 0 && squ(n / 2))ans += 4;
	if (squ(n))ans += 4;
	cout << ans;
	return 0;
}

 

NetEaseプログラミング問題3、ストーンボードのジャンプ(動的計画法)

ジャンピングストーンボード(動的計画法)

Xiaoyiが石の道にやって来て、各石のスラブには1から1、2、3の番号が付けられています。
この石の道は特別な規則に従ってのみ前進できます:Xiaoyiの現在の場所の場合K、Xiaoyiの番号が付けられたスレートは一度にKの約数(1とKを除く)を前方にジャンプします。つまり、K + X(Xは1ではないKの約数であり、それ自体ではありません)の位置にジャンプします。Xiao Yiは現在、番号Nのスレートにいます。彼は番号Mのスレートにジャンプしたいと考えています。XiaoYiは、それに到達するのに少なくとも数回のジャンプが必要であることを知りたいと考えています。
例:
N = 4、M = 24:
4-> 6-> 8-> 12-> 18-> 24
したがって、Xiaoyiは4番目の石から24番目の石にジャンプするために少なくとも5回ジャンプする必要があります 

説明を入力してください:

输入为一行,有两个整数N,M,以空格隔开。
(4 ≤ N ≤ 100000)
(N ≤ M ≤ 100000)

出力の説明:

输出小易最少需要跳跃的步数,如果不能到达输出-1

入力例:

4 24

出力例:

5

コード:

#include <iostream>
using namespace std;
 
int ans[100001];
 
int main()
{
	int n, m;
	cin >> n >> m;
	if (n == m)
	{
		cout << 0;
		return 0;
	}
	for (int i = n+1; i <= m; i++)ans[i] = 100000;
	ans[n] = 0;
	for (int i = n; i < m; i++)	for (int j = 2; j*j <= i; j++)
	{
		if (i%j)continue;
		if (i + j <= m && ans[i + j]>ans[i] + 1)ans[i + j] = ans[i] + 1;
		if (i + i / j <= m && ans[i + i / j]>ans[i] + 1)ans[i + i / j] = ans[i] + 1;
	}
	if (ans[m] == 100000)ans[m] = -1;
	cout << ans[m];
	return 0;
}

 

NetEaseプログラミングの質問4、暗い文字列(再帰的カウント)

 

「A」、「B」、「C」のみを含む文字列。「A」、「B」、「C」のいずれかに長さ3の連続した部分文字列がある場合、この文字列は純粋です。それ以外の場合は、文字列が暗いです。次に例を示します
。BAACAACCBAAA連続部分文字列「CBA」には「A」、「B」、
および「C」のいずれかが含まれているため、純粋な文字列ですAABBCCAABB「A」、「B」を含む長さ3の連続部分文字列はありません。 「C」なので、暗い文字列です。
タスクは、長さnの文字列(「A」、「B」、「C」のみを含む)が暗い文字列であるかどうかを計算することです。 

説明を入力してください:

输入一个整数n,表示字符串长度(1 ≤ n ≤ 30)

出力の説明:

输出一个整数表示有多少个暗黑字符串

入力例:

2
3

出力例:

9
21

繰り返し:list [n] = list [n-1] + list [n-2];

コード:

#include <iostream>
using namespace std;
 
int main()
{
	long long list[30] = { 3, 9, 21, 51, 123, 297, 717, 1731, 4179, 10089, 24357, 58803, 141963, 342729, 827421, 1997571, 4822563, 11642697, 28107957, 67858611, 163825179, 395508969, 954843117, 2305195203, 5565233523, 13435662249, 32436558021, 78308778291, 189054114603, 456417007497 };
	int n;
	while (cin >> n)cout << list[n-1] << endl;
	return 0;
}

 

網易プログラミングの質問5、数の反転(計算)

 

整数Xの場合、rev(X)演算は、X桁を反転し、先頭の0を削除することとして定義されます。例:
X = 123の場合、rev(X)= 321、
X = 100の場合、rev(X)= 1です。
整数xとyが与えられると、rev(rev(x)+ rev(y))は次のようになります。必要な数は? 

説明を入力してください:

输入为一行,x、y(1 ≤ x、y ≤ 1000),以空格隔开。

出力の説明:

输出rev(rev(x) + rev(y))的值

入力例:

123 100

出力例:

223

 

コード:

#include <iostream>
using namespace std;
 
int rev(int n)
{
	int a = n / 1000, b = n / 100 % 10, c = n / 10 % 10, d = n % 10;
	if (n >= 1000)return d*1000+c*100+b*10+a;
	if (n >= 100)return d*100+c*10+b;
	if (n >= 10)return d*10+c;
	return d;
}
 
int main()
{
 
	int x, y;
	cin >> x >> y;
	cout << rev(rev(x) + rev(y));
	return 0;
}

 

網易プログラミング問題6、最大の奇数(再帰計算)

 

最大の奇数除数(再帰計算)

Xiao Yiは数論のファンであり、数の奇数の約数に非常に興味があります。ある日、Xiaoyiはそのような問題に遭遇しました。関数f(x)をxの最大の奇数除数として定義し、xは正の整数です。例:f(44)= 11.
ここで、Nが与えられた場合、f(1)+ f(2)+ f(3)....... f(N)を要求する必要があります
。例:N = 7 
f(1)+ f(2)+ f(3)+ f(4)+ f(5)+ f(6)+ f(7)= 1 + 1 + 3 + 1 + 5 + 3 + 7 = 21
Xiao Yiこの問題を計算することは困難であり、彼を助けるためのアルゴリズムを設計する必要があります。 

説明を入力してください:

输入一个整数N (1 ≤ N ≤ 1000000000)

出力の説明:

输出一个整数,即为f(1) + f(2) + f(3).......f(N)

入力例:

7

出力例:

21

コードで再帰が明確になっている

 

コード:

#include <iostream>
using namespace std;
 
long long f(int n)
{
	if (n == 1)return 1;
	long long a = (n + 1) / 2;
	return f(n / 2) + a*a;
}
 
int main()
{
	int n;
	cin >> n;
	cout << f(n);
	return 0;
}

 

網易プログラミングの質問7、リンゴを買う(計算)

 

Xiaoyiは近くの店にリンゴを買いに行きました。危険なベンダーはバンドル取引を使用し、バッグごとに6パッケージとバッグごとに8パッケージしか提供しませんでした(パッケージは分割できません)。しかし、Xiaoyiは現在、正確にn個のリンゴのみを購入したいと考えており、Xiaoyiは持ち運びに便利なようにできるだけ少ないバッグを購入したいと考えています。正確にn個のリンゴを購入できない場合、Xiaoyiはそれを購入しません。 

説明を入力してください:

输入一个整数n,表示小易想购买n(1 ≤ n ≤ 100)个苹果

出力の説明:

输出一个整数表示最少需要购买的袋数,如果不能买恰好n个苹果则输出-1

入力例:

20

出力例:

3

コード:

#include <iostream>
using namespace std;
 
long long f(int n)
{
	if (n % 2)return -1;
	n /= 2;
	if (n % 4 == 0)return n / 4;
	if (n % 4 == 3 && n >= 3 || n % 4 == 2 && n >= 6 || n % 4 == 1 && n >= 9)return n / 4 + 1;
	return -1;
}
 
int main()
{
	int n;
	cin >> n;
	cout << f(n);
	return 0;
}

 

網易プログラミングの質問8、キャンディーの計算(計算)

 

A、B、Cの3人は仲良しです。誰もが手にキャンディーを持っています。それぞれのキャンディーの数はわかりませんが、
A-B、B-C、A + B、Bの情報はわかっています。+ C.これらの4つの値。各文字は各人が所有するキャンディーの数を表します。次に、
これらの4つの値を使用して、各人が持っているキャンディーの数、つまりA、B、Cを計算する必要があります。整数A、B、およびCの最大1つのセットのみが、質問のすべての条件を満たすことが保証されています。 

説明を入力してください:

输入为一行,一共4个整数,分别为A - B,B - C,A + B,B + C,用空格隔开。
范围均在-30到30之间(闭区间)。

出力の説明:

输出为一行,如果存在满足的整数A,B,C则按顺序输出A,B,C,用空格隔开,行末无空格。
如果不存在这样的整数A,B,C,则输出No

入力例:

1 -2 3 4

出力例:

2 1 3

コード:

#include <iostream>
using namespace std;
 
int main()
{
	int a, b, c, d;
	cin >> a >> b >> c >> d;
	int A = (a + c) / 2, B = c - A, C = d - B;
	if (A - B != a || B - C != b)cout << "No";
	else cout << A << " " << B << " " << C;
	return 0;
}

 

おすすめ

転載: blog.csdn.net/nameofcsdn/article/details/112210258