DJI笔试题前两题不知为啥没通过,大佬们帮忙看看。

有点气人。。前两道那么简单却一直调不出来。。

第一题题目:

题目描述:

Tom最近很闲,所以发明了一个小游戏。给出一个数字m(m 521),有三个数字牌,可以用一张牌替换随意一种数字,一张扑克牌只能用一次,现在要求求出替换后的最大值(可以选择不用数字牌)。

输入

有n组数据,先输入n。随后每组数据输入m(m 521)和三个数字牌

输出

替换后的最大数字

样例输入

2

9001

0

1

2

9301

0

1

2

样例输出

9221

9321

我的代码:提示OLE错误:您的程序还在运行,但是输出内容字符数已经超过正确答案的字符数,明显已经是错误的,不必再运行下去了。

一脸懵逼,找到挺久找不到错误。。

var acc = +read_line()
var i = 0
while (i++ < acc) {
 var input = read_line()
 var r = [], j = 0;
 r.push(read_line())
 r.push(read_line())
 r.push(read_line())
 print(maxNum(input, r))
}
function maxNum(str, replace) {
  var arr = replace.slice()
  arr.sort(function (a, b) {
    return +b - +a
  })
  var ans = ''
  for (var i = str.length - 1; i >= 0; i--) {
    var radixNum = Math.floor(+str / Math.pow(10, i) % 10)
    // var j = 0
    if (radixNum <= +arr[0]) {
      ans += arr[0]
      arr.shift()
    } else
      ans += radixNum.toString()
  }
  return ans
}

第二题题目:

题目描述:

给出n个数字(n ,数字范围为[0, 100000]),要求找出序列中有多少个连续子序列满足以下要求:子序列中任意一个数字出现次数小于k

输入

第一行输入n(n 100000)和k(k 100000)

然后输入n个数字(范围为[0,100000])

输出

满足要求的连续子序列个数

样例输入

4 1

1 2 2 3

样例输出

6

Hint

对于1 2 2 3序列,满足要求的子序列区间为[1,1] [2,2] [3,3] [4, 4] [1, 2] [3, 4]

我的思路是:初始化l=r=0指针,r不断向右移动,将当前的元素记录进hash表中,判断这个值是否小于等于k。是的话ans++,否则将l向后移动一位,r=l,继续计算。答案是能跑出来。

但运行时提示TLE时间超限。。有啥更好的思路?

#前端工程师#
全部评论
我觉得第二题要剪枝,比如k=1,你[1,2,3,3,4]的话i从1开始到3为止,i=2的时候就要可以从4开始,中间的上一次计算过了,只需加一下,没考试,上一下自己的程序,不知道对不对 int main() { int n, k; cin >> n >> k; int v[n]; for(int i=0; i<n; ++i) { cin >> v[i]; } int last = 0; int result = n;//最少有4个 for(int start = 0; start < n - 1; ++start) { int cnt = 1; int record[10];//record[i+1]表示i出现的次数,0-9 memset(record, 0, sizeof(record)); for(int i = start; i <= last; ++i) { if(record[v[i] + 1]==0) record[v[i] + 1] = 1;//初始只出现了一次 else ++record[v[i] + 1]; } result += (last - start); for(int end = last + 1; end < n; ++end) { record[v[end]+1]++; if(record[v[end]+1] > k) {//重复次数超过k last = end - 1;//下一次从last+1开始,因为下一次到last也都可以 break; } else if(end < n - 1) { ++result; } else { if(record[v[end]+1] <= k) ++result; last = end;//到达最后一个了 } } } cout<<result<<endl; }
点赞 回复 分享
发布于 2017-09-04 14:47
感觉楼主的第一题代码跟题意不太对诶,一个数字牌替换一种数字,楼主的代码里看的话是一个数字牌替换一个数字诶。 从题面上看 9001 0 1 2 把2替换掉0,不就成9221了咩
点赞 回复 分享
发布于 2017-09-11 21:25
赛马网真的服。。。。。。。。
点赞 回复 分享
发布于 2017-09-04 14:02
不懂赛码的测试用例啊
点赞 回复 分享
发布于 2017-09-04 13:50
赛马网咋这么不走心
点赞 回复 分享
发布于 2017-09-04 13:47
***坑了,测试用例感觉莫名奇妙
点赞 回复 分享
发布于 2017-09-04 13:47
同样,放弃了,实在搞不懂它的输入输出,就连测试用例也过不了,不知道大疆你再考什么,前两题本来很简单的,就是通过不了,测试用例也过不去
点赞 回复 分享
发布于 2017-09-04 13:08

相关推荐

不愿透露姓名的神秘牛友
07-11 12:31
以前小时候我最痛恨出轨、偷情的人,无论男女,为什么会出轨?现在我成了自己最讨厌的人,没想到分享的东西在牛客会被这么多人看,大家的评价都很中肯,我也认同,想过一一回复,但我还是收声了,我想我应该说说这件事,这件事一直压在我心里,是个很大的心结,上面说了人为什么出轨,我大概能明白了。我们大一下半年开始恋爱,开始恋爱,我给出了我铭记3年的承诺,我对她好一辈子,我永远不会背叛,我责任心太重,我觉得跟了我,我就要照顾她一辈子,我们在一起3年我都没有碰过她,她说往东我就往东,她说什么我做什么,她要我干什么,我就干什么!在学校很美好,中途也出过一些小插曲,比如男闺蜜、男闺蜜2号等等等。但我都强迫她改掉了,我...
牛客刘北:两个缺爱的人是没有办法好好在一起的,但世界上哪有什么是非对错?你后悔你们在一起了,但是刚刚在一起的美好也是真的呀,因为其他人的出现,你开始想要了最开始的自己,你的确对不起自己,21岁的你望高物远,你完全可以不谈恋爱,去过你想要的生活,你向往自由,在一起之后,你要想的不是一个人,而是两个人,你不是变心了,就像你说的,你受够了,你不想包容了,冷静几天是你最优的选择,爱人先爱己。
社会教会你的第一课
点赞 评论 收藏
分享
评论
1
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务