目录
网易编程题一,回文序列(贪心法)
如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如:
{1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列,
{1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列。
现在给出一个数字序列,允许使用一种转换操作:
选择任意两个相邻的数,然后从序列移除这两个数,并用这两个数字的和插入到这两个数之前的位置(只插入一个和)。
现在对于所给序列要求出最少需要多少次操作可以将其变成回文序列。
输入描述:
输入为两行,第一行为序列长度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;
}
网易编程题二,优雅的点(计数)
小易有一个圆心在坐标原点的圆,小易知道圆的半径的平方。小易认为在圆上的点而且横纵坐标都是整数的点是优雅的,小易现在想寻找一个算法计算出优雅的点的个数,请你来帮帮他。
例如:半径的平方如果为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;
}
网易编程题三,跳石板(动态规划)
跳石板(动态规划)
小易来到了一条石板路前,每块石板上从1挨着编号为:1、2、3.......
这条石板路要根据特殊的规则才能前进:对于小易当前所在的编号为K的 石板,小易单次只能往前跳K的一个约数(不含1和K)步,即跳到K+X(X为K的一个非1和本身的约数)的位置。 小易当前处在编号为N的石板,他想跳到编号恰好为M的石板去,小易想知道最少需要跳跃几次可以到达。
例如:
N = 4,M = 24:
4->6->8->12->18->24
于是小易最少需要跳跃5次,就可以从4号石板跳到24号石板
输入描述:
输入为一行,有两个整数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;
}
网易编程题四,暗黑的字符串(递推计数)
一个只包含'A'、'B'和'C'的字符串,如果存在某一段长度为3的连续子串中恰好'A'、'B'和'C'各有一个,那么这个字符串就是纯净的,否则这个字符串就是暗黑的。例如:
BAACAACCBAAA 连续子串"CBA"中包含了'A','B','C'各一个,所以是纯净的字符串
AABBCCAABB 不存在一个长度为3的连续子串包含'A','B','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;
}
网易编程题五,数字翻转(计算)
对于一个整数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;
}
网易编程题六,最大的奇约数(递推计算)
最大的奇约数(递推计算)
小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数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
小易计算这个问题遇到了困难,需要你来设计一个算法帮助他。
输入描述:
输入一个整数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;
}
网易编程题七,买苹果(计算)
小易去附近的商店买苹果,奸诈的商贩使用了捆绑交易,只提供6个每袋和8个每袋的包装(包装不可拆分)。 可是小易现在只想购买恰好n个苹果,小易想购买尽量少的袋数方便携带。如果不能购买恰好n个苹果,小易将不会购买。
输入描述:
输入一个整数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;
}
网易编程题八,计算糖果(计算)
A,B,C三个人是好朋友,每个人手里都有一些糖果,我们不知道他们每个人手上具体有多少个糖果,但是我们知道以下的信息:
A - B, B - C, A + B, B + C. 这四个数值.每个字母代表每个人所拥有的糖果数.
现在需要通过这四个数值计算出每个人手里有多少个糖果,即A,B,C。这里保证最多只有一组整数A,B,C满足所有题设条件。
输入描述:
输入为一行,一共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;
}