2017年中兴武汉秋招在线编程第二题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2017年中兴武汉秋招在线编程第二题相关的知识,希望对你有一定的参考价值。
题目描述:
给出一个只由0和1组成的二进制字符串S,写一个算法来找出:得到只由1组成的最长连续字段的不同方法数目。你可以将K个0改为1.
请注意,如果生成的字符串相同,则视两种方式为同一种方式。
输入:
该函数方法的输入包括三个参数——
size ,表示二进制字符串大小的整数
allowedChanges,表示允许的更改次数的整数(K)
str 表示二进制字符串S
输出:
返回一个整数,表示得到由1组成的最长连续字段的不同方法数目。
约束条件:1<= size<=2*10^5 0<=allowedChanges<=size
先说一下解题的思路:
step1:找到str中所有的0的索引值,并存放在数组中
step 2:每次按顺序取出连续K个0;
step3:计算取出的K个0之间的长度,n1(因为改了以后全为1)
step4:计算取出的K 个0中,第一个0前面的1的个数,n2
step5:计算取出的K 个0中,最后一个0后面的1的个数,n3
step6:有两种方式处理:
1、将每一个n1+n2+n3的值存放数组中,最后再去统计最大值的个数。(比较费内存,计算量增加)
2、动态存放。将计算的最大长度存放在maxOneLength中,并用count计数。
如果n1+n2+n3 > maxOneLength当前值,maxOneLength = n1+n2+n3,count=1(重新计数)
=maxOneLength当前值,maxOneLength不变,count++
< maxOneLength当前值,不处理
step7:输出count;
注意:自己做的时候开始想将3,4,5三步合成一步,之前计算k个0的第一个的前一个0,最后一个的后一个0的方式来计算。但是下角标和特殊情况的处理把我搞晕了,转不过来。想想还是老老实实分步来算吧。
下面是我的代码,因为大部分时间学习前端的内容,所以习惯用JS 来写。
1 function findMaxStr(str,k){ 2 var len = str.length; 3 var zeroIndex = []; 4 var maxOneLength=0; 5 var count = 0; 6 7 for (var i=0;i<len ;i++ ) //找到所有的0的位置,存在数组中。 8 { 9 if (str[i]==‘0‘) 10 { 11 zeroIndex.push(i); 12 } 13 } 14 15 16 for (var j=0;j<zeroIndex.length-k+1 ;j++ ) 17 { var n1 =0; 18 var n2 =0; 19 var n3 =0; 20 n1 = zeroIndex[j+k-1] -zeroIndex[j]+1; 21 if(j==0) 22 n2 = zeroIndex[j]; 23 else 24 n2 = zeroIndex[j]-zeroIndex[j-1]-1; 25 if (j+k-1 == zeroIndex.length-1) 26 { 27 n3 = (len-1) - zeroIndex[j+k-1]; 28 }else 29 { 30 n3 = zeroIndex[j+k]-zeroIndex[j+k-1]-1; 31 } 32 33 if (maxOneLength < n1+n2+n3) 34 { 35 maxOneLength = n1+n2+n3; 36 count = 1; 37 }else if (maxOneLength == n1 +n2 +n3) 38 { 39 count++; 40 } 41 42 } 43 44 return count;
45 }
下面是给的样例测试。
另外,想提一下的是,这个题并没有指明,假如所给的字符串中的0的个数< K个的时候,应该怎么处理。所以默认是0的个数大于K。当然,
如果考虑到这一点,也可以加一个判断语句,认为当0的个数小于K时,不能修改0,相当于问原字符串最长连续由1组成的字符串有多少种。那这样的话问题变得小复杂,
因为光这个问题就可以单独出个题,还是很常见的题。
好了,就写到这吧!欢迎大佬们指正。
以上是关于2017年中兴武汉秋招在线编程第二题的主要内容,如果未能解决你的问题,请参考以下文章
微软2017年预科生计划在线编程笔试第二场 EL SUENO
微软2017年预科生计划在线编程笔试第二场 Diligent Robots