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
同样,放弃了,实在搞不懂它的输入输出,就连测试用例也过不了,不知道大疆你再考什么,前两题本来很简单的,就是通过不了,测试用例也过不去
点赞 回复 分享
发布于 2017-09-04 13:08
***坑了,测试用例感觉莫名奇妙
点赞 回复 分享
发布于 2017-09-04 13:47
赛马网咋这么不走心
点赞 回复 分享
发布于 2017-09-04 13:47
不懂赛码的测试用例啊
点赞 回复 分享
发布于 2017-09-04 13:50
赛马网真的服。。。。。。。。
点赞 回复 分享
发布于 2017-09-04 14:02
感觉楼主的第一题代码跟题意不太对诶,一个数字牌替换一种数字,楼主的代码里看的话是一个数字牌替换一个数字诶。 从题面上看 9001 0 1 2 把2替换掉0,不就成9221了咩
点赞 回复 分享
发布于 2017-09-11 21:25

相关推荐

死在JAVA的王小美:哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈,我也是,让我免了一轮,但是硬气拒绝了
点赞 评论 收藏
分享
10-11 17:45
门头沟学院 Java
走吗:别怕 我以前也是这么认为 虽然一面就挂 但是颇有收获!
点赞 评论 收藏
分享
评论
1
5
分享
牛客网
牛客企业服务