前端 9.16腾讯-2019校园招聘(正式卷)编程题题解(js)
第一题
和谐的数字 牛牛很喜欢研究数字。一天,他发明了一种数字,叫做“和谐的数字”。 和谐的数字定义如下: 定义S(n)为数字n各位数字之和,如果S(n)能够整除n,那么就称n为一个“和谐的数字”。 现在给出数字n,请你判断这是否是一个“和谐的数字”。 输入描述: 输入的第一行包括一个正整数t(1 <= t <= 20), 表示情况数 接下来t行,每行一个正整数n(1 <= n <= 109) 输出描述: 对于每个正整数n, 如果n是和谐的数字,输出"Yes",否则输出"No"。 示例1 输入 7 34 66 72 6 32 33 86 输出 No No Yes Yes No No No
题解
1 var nn = parseInt(readline()); 2 for(let i=0;i<nn;i++){ 3 var n = parseInt(readline()); 4 if(f(n)) 5 print('Yes'); 6 else 7 print('No'); 8 } 9 function f(n) { 10 var tag = n; 11 var he = 0; 12 var p = 10; 13 do{ 14 var s = parseInt(tag/p); 15 var y = tag%p; 16 he += y; 17 tag = s; 18 }while(s); 19 //console.log(he); 20 if(n%he==0) 21 return true; 22 else 23 return false; 24 }
第一题没啥好讲的
第二题
巧克力 小Q喜欢吃甜食,有一天他拿到了一个巧克力条,这个巧克力条由许多个排在一行的巧克力球组成,有些球上有坚果,有些球上没有坚果。 小Q想把这个巧克力条给掰成很多块(每块包含至少一个巧克力球),每块的大小可以不一样,但是每块上有且只有一个坚果。 小Q想知道有多少种方式可以得到满足上述条件的若干巧克力块。如果一种方式在某两个相邻的巧克力球之间掰开但是另一种方式没有,那么这两种方式就是不同的。 如果巧克力只包含一个坚果,那么显然只有一种方式,即不掰。 输入描述: 两行,第一行一个数字N(1 <= N <= 100),表示巧克力球的个数; 第二行N个整数,每两个整数之间一个空格隔开。每个整数为0或者1,1表示这个巧克力球有坚果,0表示没有。 输出描述: 一个整数,表示方案数。 示例1 输入 4 1 0 1 1 输出 2
题解
1 var nn = parseInt(readline()); 2 var q = readline().split(' '); 3 var n=1; 4 var x; 5 var y; 6 for(let i=0;i<nn;i++){ 7 x = q.indexOf('1',i); 8 y = q.indexOf('1',x+1); 9 if(y==-1) 10 break; 11 n *= y-x; 12 i=x; 13 } 14 print(n);
解析:0010010001001000 可以看成10010001001。再然后 100 1000 100 1 。3*4*3 。 1和它后面的0可以看成一组,表示这一组有多少种情况,然后每一小组的情况累乘就是总种数
第三题
能源石 有一天,小Q找到了一座矿山,我们可以把这座矿山抽象地看成一个字符串 S 。 其中的每个矿石都可以看成一个字符,其中当一些矿石遵循一种特殊的元素排列时(用字符串 P 表示),它就能构成一块能源石。 同时,相邻的两块能源石能够融合成一块更大的能源石,融合时它们前缀和后缀相同的部分可能会重叠在一起。 比如:标准的能源石排列为aba,那么两块标准能源石的融合结果就可能为 {abaaba, ababa, aba}。一块能源石的能量等于它长度的平方。 现在小Q希望你告诉他最多可以获得多少能量。 输入描述: 输入的第一行为字符串S,第二行为字符串P。|S|, |P| <= 106 输出描述: 能够获得的能量总和 示例1 输入 xyabababcba ab 输出 36 示例2 输入 aaa aa 输出 9
题解
var s = readline(); var a = readline(); var n = 0; var t = 0; var slen = s.length; var alen = a.length; var x = 0; for(let i=0;i<slen+1;i++){ let ss = s.slice(i,i+alen); if(ss==a){ t++; x = alen-1; }else{ if(x>0) { x--; t++; }else{ n += t*t; t = 0; } } } print(n);
解析:就是挨着匹配,第一次成功开始计算长度t,然后i++,如果下一次匹配失败但是还没脱离之前匹配成功的字段,则t继续加加,匹配失败记录x--,如果中间匹配成功则重置x=alen-1,如果x=0,则说明本次匹配失败,记录这一段的能量,然后重置长度t=0,然后继续匹配,有个小细节,匹配长度是slen+1,多匹配一次使得最后一个肯定失败,避免最后一段没有记录能量