20220903京东Java岗笔试题解

T1

小红拿到了n个物品,每个物品的品质为ai。这n个物品中至少有一个真品。
已知所有真品的品质都是相同的,但赝品的品质比真品低。小红想知道,这n个物品中最多有多少赝品。
输入描述:
第一行输入一个正整数n,代表小红拿到的物品数量。
第二行输入n个正整数ai,代表每个物品的品质。
n≤1e5, ai ≤ 1e9
输出描述:
一个整数,代表赝品的数量。

input:
1
5

output:
0

只有一个物品,显然是真品

签到题,排个序统计一下就可以了。

from collections import Counter

n = int(input())
a = list(map(int, input().split()))
print(len(a) - Counter(a)[sorted(a)[-1]])

T2

题目描述
小红拿到了一个数组,她每次可以进行如下操作之一:
选择一个元素x,将其分裂为1和x-1。
·选择一个元素x,将其分裂为a和b,需要保证a*b=x
小红希望用最少的操作次数,将所有数组的所有元素全部变成1。你能帮帮她吗?
输入描述:
第一行输入一个正整数n,代表数组的长度。
第二行输入n个正整数ai,代表小红拿到的数组。
1 ≤ n, ai ≤ 1e5
输出描述:
一个整数,代表最小的操作次数。

input:
2
2 6

output:
5

预处理所有因数,然后记忆化搜索即可,不想写递归也可以写数组格式dp。

from functools import lru_cache

n = int(input())
a = list(map(int, (input().split())))
v = int(1e5) + 1
fs = [[] for _ in range(v)]
for i in range(2, v):
    for j in range(2 * i, v, i):
        fs[j].append(i)

@lru_cache(None)
def solve(n):
    if n == 1:
        return 0
    ans = 1 + solve(n - 1)
    for f in fs[n]:
        ans = min(ans, 1 + solve(f) + solve(n // f))
    return ans

print(sum(map(solve, a)))

T3

题目描述
定义一个括号串的权值为,它的最长合法括号子序列的长度。
例如,"())())的权值是4,它的最长合法括号子序列为"()()”
现在求一个给定括号串的所有子串权值之和。
输入描述:
一个仅包含'('和')'的字符串,长度不超过2e5。
输出描述:
所有子串的权值和。

input:
(()())

output:
26

解释:
权值为2的子串有2个
权值为4的子串有2个

考虑不同子串太麻烦,可以反向考虑,考虑每一对可以匹配的括号对答案的贡献。考虑这样一个子串:xx()x,x表示任意字符。如何计算中间这对括号的贡献呢?其实可以看出来,带有这对括号的子串的数量只和它左右侧的字符数量有关,根据上面这个字符串,可以得到的带有这个括号的子串:

  • xx()x
  • xx()
  • x()x
  • x()
  • ()x
  • ()

也就是6个。如何得到这个数字呢?实际上就是(括号左侧的字符数+1)*(括号右侧的字符数+1)。为什么这样是正确的呢?因为我们要考虑这对括号的贡献,那么我们就要考虑所有包含该括号的子串。假设左括号左边有n个数字,那么左边其实有(n+1)种选择——什么都不选、选1个、选2个、选3个...因为要求是连续子串,所以只能有(n+1)种选择,右侧同理。两边选择的方案数需要乘起来。

那么只需要遍历一下字符串,查到每一个右括号对应的左括号位置,(左括号左侧的字符数+1)*(右括号右侧的字符数+1)则为这个括号的贡献,总复杂度O(n)

s = input()
ans = 0
n = len(s)
l = []
for i, v in enumerate(s):
    if v == '(': l.append(i)
    elif l: ans += 2 * (l.pop() + 1) * (n - i)
print(ans)
#京东##京东笔试##笔试#
全部评论
java岗用python写
2 回复 分享
发布于 2022-09-03 21:04 湖北
大佬太强了
2 回复 分享
发布于 2022-09-03 21:02 江苏
同一批的题目一样吗
1 回复 分享
发布于 2022-09-08 16:13 河南
楼主,按照算法()()权值是12,但是我自己觉得是4*1+2*6=16;合法的序列难道不可以相同吗? 比如这个的有(),()(,()),(),((),)()这六个权值为2的?
1 回复 分享
发布于 2022-09-06 20:58 四川
大佬帮看一下我的代码,也是这个思路但是过了22%
1 回复 分享
发布于 2022-09-03 21:07 四川
第三题我做法跟你一样,测试用例也过了,但是一提交就是0,换成long和long long都没用,我是c++
1 回复 分享
发布于 2022-09-03 21:06 湖南
第三题样例输出应该是34吧,8个权值2,3个权值4,一个权值6
点赞 回复 分享
发布于 2022-09-16 09:43 上海
java实现一二题,第三题看不懂题目!
点赞 回复 分享
发布于 2022-09-15 23:39 甘肃
s = input() start, end = -1, len(s) res = 0 for i in range(1, end):     if s[i-1] == "(" and s[i] == ")":         res += (i - 1 - start) * (end - i) * 2 print(res) 大佬,看看这样行不
点赞 回复 分享
发布于 2022-09-07 15:24 广东
牛逼
点赞 回复 分享
发布于 2022-09-06 12:44 浙江
hi~同学,秋招遇“寒气”,牛客送温暖啦!23届秋招笔面经有奖征集中,参与就得牛客会员7天免费体验,最高赢300元京东卡!戳我去看>>>https://www.nowcoder.com/link/zhengjipinglun
点赞 回复 分享
发布于 2022-09-05 14:25 北京
楼主牛逼!借楼,华为社招校招od可咨询,欢迎私聊~笔试面试全程辅导~
点赞 回复 分享
发布于 2022-09-05 10:06 广东
请教一下楼主,第三题不是说找到一个有效的括号后,只需要计算(左括号位置+1)*(右括号位置+1),那代码中怎么还乘了一个2。
点赞 回复 分享
发布于 2022-09-05 08:59 上海
第二题你这个代码如果在自己电脑上,会递归深度超出,所以我把数据范围缩小到1-100了,后面附上测试代码和结果: import time import random import math from collections import defaultdict def solution(n,input):     result = 0     dp_dict = defaultdict(int)     dp_dict[1] = 0     input_max = max(input)     for number in range(2,input_max):         if number not in dp_dict:             dp_dict[number] = dp_dict[number-1] + 1         if number + 1 in dp_dict:             dp_dict[number+1] = min(dp_dict[number+1],dp_dict[number]+1)         else:             dp_dict[number+1] = dp_dict[number] + 1         for second in range(2,min(number+1,int(math.sqrt(input_max))+1)):             if number * second > input_max:                 break             if number * second in dp_dict:                 dp_dict[number*second] = min(dp_dict[number*second], dp_dict[number]+dp_dict[second]+1)             else:                 dp_dict[number*second] = dp_dict[number]+dp_dict[second]+1     for number in input:         result += dp_dict[number]     return result
点赞 回复 分享
发布于 2022-09-05 00:05 浙江
第三题括号子串的java代码,大佬帮忙看下有什么问题
点赞 回复 分享
发布于 2022-09-04 11:59 陕西
nb
点赞 回复 分享
发布于 2022-09-04 10:29 北京
请问第二题为什么预处理因数是这样写的?
点赞 回复 分享
发布于 2022-09-04 09:19 广东
第三题要求的是子序列,子序列的意思就是顺序不变,但可以不连续。而题目要求的是该字符串所有“子串”的权值之和。比较直观的想法那就是遍历所有“子串”O(n^2),然后每个子串套用上述定义找到最长子序列,即为权值O(n),所以总的时间复杂度为O(n^3)。可以用dp进行优化,dp[i][j]表示i...j这个子串权值大小,可以从其他dp推导而来,优化为O(n^2)。而楼主的想法则是将每一对有效的括号作为主体,从每一对有效括号为视角出发,探究向两边扩展的子串,能带来多少贡献
点赞 回复 分享
发布于 2022-09-04 00:10 上海
太牛了
点赞 回复 分享
发布于 2022-09-03 22:34 上海
tql
点赞 回复 分享
发布于 2022-09-03 22:12 福建

相关推荐

刘湘_passion:太强了牛肉哥有被激励到
点赞 评论 收藏
分享
评论
52
92
分享

创作者周榜

更多
牛客网
牛客企业服务