网易2017秋招编程题集合-牛客网

网易2017秋招编程题集合-牛客网

链接:https://www.nowcoder.com/questionTerminal/0147cbd790724bc9ae0b779aaf7c5b50
来源:牛客网

如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如:

{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>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
const int MAXN = 55; 

int n, num[MAXN]; 

int main(){
	freopen("in.txt", "r", stdin); 

	int l, r, l_val, r_val, cnt;
	while(scanf("%d", &n) != EOF){
		for(int i=0; i<n; ++i){
			scanf("%d", &num[i]);
		}
		cnt = 0;
		l = 0; r = n-1;
		l_val = 0; r_val = 0;
		while(l <= r){
			if(l_val == r_val){
				l_val = num[l]; l++;
				r_val = num[r]; r--;
			}else if(l_val > r_val){
				r_val += num[r]; r--;
				cnt++;
			}else{
				l_val += num[l]; l++;
				cnt++;
			}
		}
		if(l_val != r_val){
			cnt++;
		}
		printf("%d\n", cnt);
	}
	return 0;
}

  

链接:https://www.nowcoder.com/questionTerminal/0960cb46233b446687b77facc9148b89
来源:牛客网

小易有一个圆心在坐标原点的圆,小易知道圆的半径的平方。小易认为在圆上的点而且横纵坐标都是整数的点是优雅的,小易现在想寻找一个算法计算出优雅的点的个数,请你来帮帮他。

例如:半径的平方如果为25

优雅的点就有:(+/-3, +/-4), (+/-4, +/-3), (0, +/-5) (+/-5, 0),一共12个点。

输入描述:
输入为一个整数,即为圆半径的平方,范围在32位int范围内。
输出描述:
输出为一个整数,即为优雅的点的个数
输入例子:
25
输出例子:
12

判断约数。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;

int main(){

    int n, cnt, l, r;
    while(scanf("%d", &n) != EOF){
        if(n == 0){
            printf("%d\n", 1);
            continue;
        }
        l = 0;
        r = int(sqrt(n)) + 1;
        cnt = 0;
        while(l <= r){
            if(l*l + r*r == n){
                if(l == 0){
                    cnt += 2;
                }else if(l == r){
                    cnt += 2;
                }else{
                    cnt += 4;
                }
                l++; r--;
            }else if(l*l + r*r > n){
                r--;
            }else{
                l++;
            }
        }
        printf("%d\n", 2*cnt );
    }
    return 0;
}

  

链接:https://www.nowcoder.com/questionTerminal/4284c8f466814870bae7799a07d49ec8
来源:牛客网

小易来到了一条石板路前,每块石板上从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

使用bfs,并且设置一个vis来判断不走走过的路。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
const int MAXN = 1000000;

int sq[2*MAXN], sq_step[2*MAXN], vis[MAXN];

int main(){

    int n, m, tail, head, ans, tmp_step, tmp, t;
    while(scanf("%d %d", &n, &m) != EOF){
        memset(vis, 0, sizeof(vis));
        head = 0; tail = 0;
        sq[head] = n; sq_step[head++] = 0;
        vis[n] = 1;  ans = -1;
        while(head > tail){
            tmp = sq[tail];
            tmp_step = sq_step[tail++];
            if(tmp == m){
                ans = tmp_step;
                break;
            }
            for(int i=2; i*i<=tmp; ++i){
                if(tmp%i == 0){
                    t = tmp + i;
                    if(t <= m && vis[t] == 0){
                        vis[t] = 1;
                        sq[head] = t; sq_step[head++] = tmp_step + 1;
                    }
                    t = tmp + tmp/i;
                    if(t <= m && vis[t] == 0){
                        vis[t] = 1;
                        sq[head] = t; sq_step[head++] = tmp_step + 1;
                    }
                }
            }
        }
        printf("%d\n", ans );
    }
    return 0;
}

  

链接:https://www.nowcoder.com/questionTerminal/7e7ccd30004347e89490fefeb2190ad2
来源:牛客网

一个只包含‘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

不知道我的dp公式为啥不对,init() 是我自己的公式,没找到哪里不对。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 35;

long long dp[3][MAXN];

void init(){
    dp[0][1] = dp[1][1] = dp[2][1] = 1;
    dp[0][2] = dp[1][2] = dp[2][2] = 3;
    for(int i=3; i<MAXN; ++i){
        dp[0][i] = dp[0][i-1] + (dp[1][i-1] - dp[2][i-2]) + (dp[2][i-1] - dp[1][i-2]);
        dp[1][i] = dp[1][i-1] + (dp[2][i-1] - dp[0][i-2]) + (dp[0][i-1] - dp[2][i-2]);
        dp[2][i] = dp[2][i-1] + (dp[1][i-1] - dp[0][i-2]) + (dp[0][i-1] - dp[1][i-2]);
    }
}

void init2(){
    dp[0][2] = 3; dp[1][2] = 6;
    for(int i=3; i<MAXN; ++i){
        dp[0][i] = dp[0][i-1] + dp[1][i-1];
        dp[1][i] = 2*dp[0][i-1] + dp[1][i-1];
    }
}

int main(){

    int n;
    long long ans;
    init2();
    while(scanf("%d", &n) != EOF){
        ans = dp[0][n] + dp[1][n]; // + dp[2][n];
        printf("%lld\n",  ans);
    }
    return 0;
}

  

链接:https://www.nowcoder.com/questionTerminal/bc62febdd1034a73a62224affe8bddf2
来源:牛客网

对于一个整数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>
#include <cstdio>
#include <cstdlib>
using namespace std;

int REV(int val){
    int ans = 0;
    while(val){
        ans = 10*ans + val%10;
        val = val/10;
    }
    return ans;
}

int main(){
    int n, m, ans;
    while(scanf("%d %d", &n, &m) != EOF){
        ans = REV( REV(n) + REV(m) );
        printf("%d\n", ans );
    }
    return 0;
}

  

链接:https://www.nowcoder.com/questionTerminal/49cb3d0b28954deca7565b8db92c5296
来源:牛客网

小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数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

使用dfs,使用求和公式 对 1-n的所有奇数进行求和,然后再对偶数折半,求其dfs。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;

long long dfs(int n){
    if(n <= 0){ return 0; }

    if(n == 1 ){ return 1; }

    if(n%2 == 0){
        return dfs(n/2) + (long long)(n-1+1)*(n/2)/2;
    }else{
        return dfs((n-1)/2) + (long long)(n+1)*((n+1)/2)/2;
    }
}

int main(){
    int n;
    long long ans;
    while(scanf("%d", &n) != EOF){
        ans = dfs(n);
        printf("%lld\n", ans );
    }
    return 0;
}

  

链接:https://www.nowcoder.com/questionTerminal/61cfbb2e62104bc8aa3da5d44d38a6ef
来源:牛客网

小易去附近的商店买苹果,奸诈的商贩使用了捆绑交易,只提供6个每袋和8个每袋的包装(包装不可拆分)。 可是小易现在只想购买恰好n个苹果,小易想购买尽量少的袋数方便携带。如果不能购买恰好n个苹果,小易将不会购买。

输入描述:
输入一个整数n,表示小易想购买n(1 ≤ n ≤ 100)个苹果
输出描述:
输出一个整数表示最少需要购买的袋数,如果不能买恰好n个苹果则输出-1
输入例子:
20
输出例子:
3

多重背包问题。简易版。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
const int MAXN = 105;

int num[MAXN];

void init(){
    memset(num, 0x3f3f3f3f, sizeof(num));
    num[0] = 0;
    for(int i=6; i<MAXN; ++i){
        num[i] = min(num[i], num[i-6] + 1);
    }
    for(int i=8; i<MAXN; ++i){
        num[i] = min(num[i], num[i-8] + 1);
    }
}

int main(){
    init();
    int n, ans;
    while(scanf("%d", &n) != EOF){
        if(num[n] != 0x3f3f3f3f){
            ans = num[n];
        }else{
            ans = -1;
        }
        printf("%d\n", ans );
    }
    return 0;
}

  

链接:https://www.nowcoder.com/questionTerminal/02d8d42b197646a5bbd0a98785bb3a34
来源:牛客网

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 <cstdio>

int main(){

    int a, b, c, d, flag;
    int ans_a, ans_b, ans_c;
    while(scanf("%d%d%d%d", &a, &b, &c, &d) != EOF){
        flag = 0;
        if((a+c)%2 == 0){
            ans_a = (a+c)/2;
        }else{
            flag = 1;
        }
        if((b+d)%2 == 0){
            ans_b = (b+d)/2;
        }else{
            flag = 1;
        }
        if(flag==0){
            ans_c = ans_b - b;
        }
        if(flag==0 && (ans_a - ans_b)==a && (ans_b - ans_c)==b && (ans_a+ans_b)==c && (ans_b+ans_c)==d){
            printf("%d %d %d\n", ans_a, ans_b, ans_c );
        }else{
            printf("No\n");
        }
    }
    return 0;
}

  

时间: 2024-08-02 02:41:12

网易2017秋招编程题集合-牛客网的相关文章

网易2017秋招编程题集合_以下代码全部来自牛客网

如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列.例如:{1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列, {1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列.现在给出一个数字序列,允许使用一种转换操作:选择任意两个相邻的数,然后从序列移除这两个数,并用这两个数字的和插入到这两个数之前的位置(只插入一个和).现在对于所给序列要求出最少需要多少次操作可以将其变成回文序列. 链接:https://ww

2017年校招全国统一模拟笔试(第二场)编程题集合-牛客网

 2017年校招全国统一模拟笔试(第二场)编程题集合-牛客网 链接:https://www.nowcoder.com/questionTerminal/276712b113c6456c8cf31c5073a4f9d7来源:牛客网 牛牛有两个字符串(可能包含空格),牛牛想找出其中最长的公共连续子串,希望你能帮助他,并输出其长度. 输入描述: 输入为两行字符串(可能包含空格),长度均小于等于50. 输出描述: 输出为一个整数,表示最长公共连续子串的长度. 输入例子: abcde abgde 输出例子

网易2017秋招编程题——回文序列 解题报告

Problem:https://www.nowcoder.com/question/next?pid=2811407&qid=46573&tid=6015849 如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列.例如: {1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列, {1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列. 现在给出一个数字序列,允许使用一种转换操作: 选择任意两个相邻的数,

网易2017春招[编程题]分饼干@Java

o6b19TK菜3孤Whttp://www.docin.com/app/user/userinfo?userid=178838282 eO白懊窒1瘫9肯3钠E山段http://huiyi.docin.com/hwhx2495 53k腾7懦95泛纤3Vhttp://tushu.docin.com/sina_5847498140 柑5v课9N1缴遮9毖Fhttp://www.docin.com/app/user/userinfo?userid=179253259 h3G伟t涝r焉布7R9http:/

算法是什么我记不住,But i do it my way. 解一道滴滴出行秋招编程题。

只因在今日头条刷到一篇文章,我就这样伤害我自己,手贱. 刷头条看到一篇文章写的滴滴出行2017秋招编程题,后来发现原文在这里http://www.cnblogs.com/SHERO-Vae/p/5882357.html.看了下,挺有意思,于是就想了想,又写了写,最终撸出来了.刚开始一看顿时感觉很熟悉,大学数据结构和算法课肯定讲过相关东西,什么深度搜索,广度搜索,最优路径,最优解...但是现在你让我说个一二三,我还就只记住几个名字,说不定名字都记错.我向来不喜欢死记东西,能查到的真的不想背下来,而

滴滴出行秋招编程题

算法是什么我记不住,But i do it my way. 解一道滴滴出行秋招编程题. 只因在今日头条刷到一篇文章,我就这样伤害我自己,手贱. 刷头条看到一篇文章写的滴滴出行2017秋招编程题,后来发现原文在这里http://www.cnblogs.com/SHERO-Vae/p/5882357.html.看了下,挺有意思,于是就想了想,又写了写,最终撸出来了.刚开始一看顿时感觉很熟悉,大学数据结构和算法课肯定讲过相关东西,什么深度搜索,广度搜索,最优路径,最优解...但是现在你让我说个一二三,

好未来2017秋招笔试真题二 --牛客网

好未来2017秋招笔试真题二 --牛客网 链接:https://www.nowcoder.com/questionTerminal/ee5de2e7c45a46a090c1ced2fdc62355来源:牛客网 将一句话的单词进行倒置,标点不倒置.比如 I like beijing. 经过函数后变为:beijing. like I 输入描述: 每个测试输入包含1个测试用例: I like beijing. 输入用例长度不超过100 输出描述: 依次输出倒置之后的字符串,以空格分割 输入例子: I

【华为机试】找最高分(通过此题熟悉牛客网Node输入输出)

来源:牛客网 老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. 输入描述: 输入包括多组测试数据.每组输入第一行是两个正整数N和M(0 < N <= 30000,0 < M < 5000),分别代表学生的数目和操作的数目.学生ID编号从1编到N.第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩接下来又M行,每一行有一个字符C(只取'Q'或'U'),和两个正整数A,B,当C为'Q'的时候

网易2017秋招笔试题3:最长公共子括号序列长度

[问题来源]网传的2017网易秋招笔试题 [问题描述] [算法思路] 下面的解题思路摘自  http://www.cnblogs.com/Atanisi/p/7500186.html 刚看到题我就想到暴力解,深搜出所有合法的括号序列,再依次比较公共子序列的长度,返回最长的.但是深搜一般和路径有关,这道题仅仅需要最大公共子序列的长度.而我们发现最大公共子序列的长度就是 s.size() - 1(当且仅当修改距离为 1 时 LCS 最大), 那么我们就想到,可以变换 s 中一个括号的位置,枚举所有的