序列和-------一道大厂秋招笔试题

题目:

给出一个正整数N和长度L,找出一段长度大于等于L的连续非负整数,他们的和恰好为N。答案可能有多个,我我们需要找出长度最小的那个。
例如 N = 18 L = 2:
5 + 6 + 7 = 18
3 + 4 + 5 + 6 = 18
都是满足要求的,但是我们输出更短的 5 6 7

综合网上给出的参考答案,有两种相对简单,用python语言重写一下。

方法一:从数列的角度出发

解题思路:等差数列求和。

该题可理解为“一段长度大于等于L的等差数列之和等于N”的过程。

S =L(a1+an) / 2

= L(a1+a1+(L-1)d) / 2

= L(2a1+L-1) / 2= N

得:a1= (2N-L^2+L) / (2L)因此只需要判断求得的a1是否为正整数即可

 1 N = eval(input(‘请输入一个正整数:‘))
 2 L = eval(input(‘请输入长度:‘))
 3 while True:
 4     a1 = (2 * N - L * L + L) / (2 * L)
 5     if (2*N-L**2+L)%(2*L) == 0 and a1 >0: #确保a1为正整数
 6         an = a1 + L
 7         res = [i for i in range(int(a1), int(an))]
 8         print(res)
 9         break
10     else:
11         L += 1
12         continue

方法二: 从中位数的角度出发。

解题思路:所求的序列的个数要么是偶数,要么是单数。那么,其中位数要么是整数,要么是小数部分为5的小数。例如【5,6,7】的中位数就等于(5+6+7)/3 = 6,而【6,7,8,9】的中位数等于(6+7+8+9)/4=7.5。

所以,情况可以分为两种,第一:序列长度为偶数的情况,此时N=中位数*L;第二:序列长度为奇数的情况,此时,N=xx.5 * L。

 1 import math
 2 N = eval(input(‘请输入一个正整数:‘))
 3 L = eval(input(‘请输入长度:‘))
 4
 5 while True:
 6     if L % 2 ==1 and N % L == 0: #如果序列长度为奇数且中位数为整数
 7         middle = N / L         #中位数
 8         if middle-(L-1)/2 >0:  #必须确保序列的首位大于0
 9             list = [i for i in range(int(middle-(L-1)/2), int(middle+(L-1)/2)+1)]
10             print(list)
11             break
12     elif L % 2 ==0 and N/L - math.floor(N/L) == 0.5: #如果序列长度为偶数,且中位数为xx.5
13         middle = N / L        #中位数
14         if math.floor(middle-L/2)>0:   #必须确保序列的首位大于0
15             list = [i for i in range(math.ceil(middle-L/2), math.floor(middle+L/2)+1)]
16             print(list)
17             break
18     else:
19         L += 1
20         continue

原文地址:https://www.cnblogs.com/GouQ/p/12589928.html

时间: 2024-10-14 11:15:02

序列和-------一道大厂秋招笔试题的相关文章

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

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

美团2017秋招笔试题 拼凑钱币

给你六种面额 1.5.10.20.50.100 元的纸币,假设每种币值的数量都足够多,编写程序求组成N元(N为0~10000的非负整数)的不同组合的个数. 输入描述: 输入包括一个整数n(1 ≤ n ≤ 10000) 输出描述: 输出一个整数,表示不同的组合方案数 设f[i][j]为使用a[0]-a[i]的面额凑到j元的不同组合个数 #include <iostream> #include <cstring> using namespace std; int a[6] = {1,5

TX2017秋招笔试题之geohash编码

问题描述:geohash编码:geohash常用于将二维的经纬度转换为字符串,分为两步:第一步是经纬度的二进制编码,第二步是base32转码. 此题考察纬度的二进制编码:算法对纬度[-90, 90]通过二分法进行无限逼近(取决于所需精度,本题精度为6). 注意,本题进行二分法逼近过程中只采用向下取整来进行二分,针对二分中间值属于右区间.算法举例如下: 针对纬度为80进行二进制编码过程: 1) 区间[-90, 90]进行二分为[-90, 0),[0, 90],成为左右区间,可以确定80为右区间,标

TX2017秋招笔试题之素数对

问题描述: 给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果.输入值小于1000. 如,输入为10, 程序应该输出结果为2.(共有两对质数的和为10,分别为(5,5),(3,7)) 输入描述: 输入包括一个整数n,(3 ≤ n < 1000) 输出描述: 输出对数 示例1 输入 10 输出 2 ------------------------------------------------ 解决思路; 首先判断素数(在大于1的自然数中,除了1和它本身以外不再有其他因数

滴滴秋招笔试题(2016-09-18)

1.地下迷宫 这道题是网上找到别人的答案,拿过来学习学习,望勿怪. import java.io.BufferedInputStream; import java.util.Scanner; public class 地下迷宫 { public static int[][] dir = { { 1, 0, 0 }, { 0, 1, 1 }, { -1, 0, 3 }, { 0, -1, 1 } }; public static int n = 0; public static int m = 0

TX2017秋招笔试题之编码

问题描述: 假定一种编码的编码范围是a ~ y的25个字母,从1位到4位的编码,如果我们把该编码按字典序排序,形成一个数组如下: a, aa, aaa, aaaa, aaab, aaac, - -, b, ba, baa, baaa, baab, baac - -, yyyw, yyyx, yyyy 其中a的Index为0,aa的Index为1,aaa的Index为2,以此类推. 编写一个函数,输入是任意一个编码,输出这个编码对应的Index. 输入描述: 输入一个待编码的字符串,字符串长度小于

2017腾讯秋招笔试题之编码

Description: 假定一种编码的编码范围是a ~ y的25个字母,从1位到4位的编码,如果我们把该编码按字典序排序,形成一个数组如下: a, aa, aaa, aaaa, aaab, aaac, - -, b, ba, baa, baaa, baab, baac - -, yyyw, yyyx, yyyy 其中a的Index为0,aa的Index为1,aaa的Index为2,以此类推.    编写一个函数,输入是任意一个编码,输出这个编码对应的Index Input: 输入一个待编码的字

一道简单的 Java 笔试题,但值得很多人反思

面试别人,对我来说是一件新奇事,以前都是别人面试我.我清楚地知道,我在的地域与公司,难以吸引到中国的一流软件人才.所以,我特地调低了期望,很少问什么深入的技术问题,只问一些广泛的.基础的.我只要最终给Leader一句“这个人技术还行/很好/非常好”,就行了.至于其它能力.综合水平,由别人把关.为此,在挑选唯一的一道笔试题时,我特别地上心. 首先,我不敢用网上那些广为流传的,比如Leetcode.<程序员面试宝典>里的题——这些都太难了!正儿八经做,其实很少有人能在1小时内完美做出来,除非之前遇

一道Realtek的C笔试题

上周五参加Realtek的笔试题,有一道选择题,大概是这样的: const char a1[] = "abc"; const char a2[] = "abc"; const char *p1 = "abc"; const char *p2 = "abc"; A.a1和a2一样,p1和p2不一样: B.a1和a2不一样,p1和p2一样: C.a1和a2不一样,p1和p2也不一样: D.a1和a2一样,p1和p2一样: 我在VS