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

腾讯2017暑期实习生编程题 第二题 字符移位

微软2017年预科生计划在线编程笔试第二场 Queen Attack

2017年上半年网工下午卷第二题问题3acl

2017年腾讯 秋招软件开发笔试编程题回忆版