牛客网-网易2017内推笔试编程题合集(二)
网易2017内推笔试编程题合集(二)
(4)
有一片1000*1000的草地,小易初始站在(1,1)(最左上角的位置)。小易在每一秒会横向或者纵向移动到相邻的草地上吃草(小易不会走出边界)。大反派超超想去捕捉可爱的小易,他手里有n个陷阱。第i个陷阱被安置在横坐标为xi ,纵坐标为yi 的位置上,小易一旦走入一个陷阱,将会被超超捕捉。你为了去解救小易,需要知道小易最少多少秒可能会走入一个陷阱,从而提前解救小易。
题解:
水题。
#include <cstdio> const int MAXN = 1000 + 10; int n, X[MAXN], Y[MAXN]; int main(){ int ans, tmp; while(scanf("%d", &n) != EOF){ for(int i=0; i<n; ++i){ scanf("%d", &X[i]); } for(int i=0; i<n; ++i){ scanf("%d", &Y[i]); } ans = MAXN*MAXN; for(int i=0; i<n; ++i){ tmp = X[i] - 1 + Y[i] - 1; if(tmp < ans){ ans = tmp; } } printf("%d ", ans ); } return 0; }
(5)
链接:https://www.nowcoder.com/questionTerminal/9d1559511b3849deaa71b576fa7009dc?source=relative
来源:牛客网
“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。花花非常喜欢这种拥有对称美的回文串,生日的时候她得到两个礼物分别是字符串A和字符串B。现在她非常好奇有没有办法将字符串B插入字符串A使产生的字符串是一个回文串。你接受花花的请求,帮助她寻找有多少种插入办法可以使新串是一个回文串。如果字符串B插入的位置不同就考虑为不一样的办法。
例如:
A = “aba”,B = “b”。这里有4种把B插入A的办法:
* 在A的第一个字母之前: "baba" 不是回文
* 在第一个字母‘a’之后: "abba" 是回文
* 在字母‘b’之后: "abba" 是回文
* 在第二个字母'a'之后 "abab" 不是回文
所以满足条件的答案为2
输入描述:
每组输入数据共两行。 第一行为字符串A 第二行为字符串B 字符串长度均小于100且只包含小写字母
输出描述:
输出一个数字,表示把字符串B插入字符串A之后构成一个回文串的方法数
输入
aba b
输出
2
考察对字符串string的使用
#include <string> #include <iostream> using namespace std; bool Judge(string s){ int l = 0, r = s.length()-1; while(l < r){ if(s[l] == s[r]){ ++l; --r; }else{ return false; } } return true; } int main(){ string s1, s2; cin >> s1; cin >> s2; int cnt =0, len1 = s1.length(), len2 = s2.length(); for(int i=0; i<len1; ++i){ string t1 = s1.substr(0, i) + s2 + s1.substr(i); if(Judge(t1)){ ++cnt; } } if(Judge(s1 + s2)){ ++cnt; } cout << cnt << endl; return 0; }
(6)
链接:https://www.nowcoder.com/questionTerminal/5ee8df898312465a95553d82ad8898c3?source=relative
来源:牛客网
小易总是感觉饥饿,所以作为章鱼的小易经常出去寻找贝壳吃。最开始小易在一个初始位置x_0。对于小易所处的当前位置x,他只能通过神秘的力量移动到 4
* x + 3或者8 * x + 7。因为使用神秘力量要耗费太多体力,所以它只能使用神秘力量最多100,000次。贝壳总生长在能被1,000,000,007整除的位置(比如:位置0,位置1,000,000,007,位置2,000,000,014等)。小易需要你帮忙计算最少需要使用多少次神秘力量就能吃到贝壳。
输入描述:
输入一个初始位置x_0,范围在1到1,000,000,006
输出描述:
输出小易最少需要使用神秘力量的次数,如果使用次数使用完还没找到贝壳,则输出-1
输入
125000000
输出
1
这道题因为数据大,有难度。参考网友的答案。【http://blog.csdn.net/fcxxzux/article/details/52138964#t0】
#include <cstdio> #include <string> #include <iostream> using namespace std; const int MAXN = 1000000; const int MOD = 1e9 + 7; int main(){ int n, t, ans; while(scanf("%d", &n) != EOF){ t = 4; ans = 100001; for(int i=1; i<=300000; ++i){ int x = ((long long)(n)*t + t - 1)%MOD; if(x == 0){ ans = (i + 1)/3 + ((i + 1)%3?1:0); break; } t = t*2%MOD; } printf("%d ", ans>100000?-1:ans ); } return 0; }
(7)
考拉有n个字符串字符串,任意两个字符串长度都是不同的。考拉最近学习到有两种字符串的排序方法: 1.根据字符串的字典序排序。例如:
"car" < "carriage" < "cats" < "doggies < "koala"
2.根据字符串的长度排序。例如:
"car" < "cats" < "koala" < "doggies" < "carriage"
考拉想知道自己的这些字符串排列顺序是否满足这两种排序方法,考拉要忙着吃树叶,所以需要你来帮忙验证。
#include <iostream> #include <string> using namespace std; const int MAXN = 101; int main(){ int n, len_f, lex_f; string s[MAXN]; while(cin >> n){ for(int i=0; i<n; ++i){ cin >> s[i]; } len_f = 1; lex_f = 1; for(int i=0; i<n-1; ++i){ if(s[i].length() > s[i+1].length()){ len_f = 0; break; } } for(int i=0; i<n-1; ++i){ int l1 = 0, l2 = 0, ok = 0; while(l1<s[i].length() && l2 < s[i+1].length()){ if(s[i][l1] == s[i+1][l2]){ ++l1; ++l2; }else if(s[i][l1] < s[i+1][l2]){ ok = 1; break; }else{ ok = 0; break; } } if(ok == 0 && l1 != s[i].length()){ lex_f = 0; break; } } if(lex_f && len_f){ printf("both "); }else if(lex_f){ printf("lexicographically "); }else if(len_f){ printf("lengths "); }else{ printf("none "); } } return 0; }
(8)
小易喜欢的单词具有以下特性:
1.单词每个字母都是大写字母
2.单词没有连续相等的字母
3.单词没有形如“xyxy”(这里的x,y指的都是字母,并且可以相同)这样的子序列,子序列可能不连续。
例如:
小易不喜欢"ABBA",因为这里有两个连续的'B'
小易不喜欢"THETXH",因为这里包含子序列"THTH"
小易不喜欢"ABACADA",因为这里包含子序列"AAAA"
小易喜欢"A","ABA"和"ABCBA"这些单词
给你一个单词,你要回答小易是否会喜欢这个单词。
#include <iostream> #include <string> using namespace std; const int MAXN = 101; int main(){ int nol = 0; string s; cin >> s; for(int i=0; i<s.length(); ++i){ if(i+1 < s.length() && s[i] == s[i+1]){ nol = 1; break; } if(i+3 < s.length() && s[i]==s[i+2] && s[i+1] == s[i+3] ){ nol = 1; break; } } if(nol == 0){ cout << "Likes" << endl; }else{ cout << "Dislikes" << endl; } return 0; }
(9)
Fibonacci数列是这样定义的:
F[0] = 0
F[1] = 1
for each i ≥ 2: F[i] = F[i-1] + F[i-2]
因此,Fibonacci数列就形如:0, 1, 1, 2, 3, 5, 8, 13, ...,在Fibonacci数列中的数我们称为Fibonacci数。给你一个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X-1或者X+1,现在给你一个数N求最少需要多少步可以变为Fibonacci数。
#include <cstdio> const int MAXN = 1000000; int cnt, dp[1000]; void init(){ dp[0] = 0; dp[1] = 1; for(int i=2; i<MAXN; ++i){ dp[i] = dp[i-1] + dp[i-2]; if(dp[i] > MAXN){ cnt = i; break; } } } int main(){ int n, ans; init(); while(scanf("%d", &n) != EOF){ int l = 0, r = cnt, mid = 0; while(l <= r){ mid = l + (r - l)/2; if(dp[mid+1] >= n && dp[mid] <= n){ ans = (dp[mid+1] - n) < (n - dp[mid])?(dp[mid+1] - n) : (n - dp[mid]) ; break; }else if(dp[mid] > n){ r = mid - 1; }else{ l = mid + 1; } } printf("%d ", ans ); } return 0; }
(10)
小易邀请你玩一个数字游戏,小易给你一系列的整数。你们俩使用这些整数玩游戏。每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字。 例如: 如果{2,1,2,7}是你有的一系列数,小易说的数字是11.你可以得到方案2+2+7 = 11.如果顽皮的小易想坑你,他说的数字是6,那么你没有办法拼凑出和为6 现在小易给你n个数,让你找出无法从n个数中选取部分求和的数字中的最小数。
#include <cstdio> #include <cstring> const int MAXN = 1000000; int n, num[MAXN], dp[MAXN]; int main(){ while(scanf("%d", &n) != EOF){ int s = 0; for(int i=0; i<n; ++i){ scanf("%d", &num[i]); s += num[i]; } memset(dp, 0, sizeof(dp)); dp[0] = 1; for(int i=0; i<n; ++i){ for(int j=s; j>=num[i]; --j){ if(dp[j - num[i]]){ dp[j] = 1; } } } int ans; for(int i=0; i<MAXN; ++i){ if(dp[i] == 0){ ans = i; break; } } printf("%d ", ans ); } return 0; }