第一题: vivo手机产能
题干
在vivo产线上,每位职工随着对手机加工流程认识的熟悉和经验的增加,日产量也会不断攀升。
假设第一天量产1台,接下来2天(即第二、三天)每天量产2件,接下来3天(即第四、五、六天)每天量产3件 … …
以此类推,请编程计算出第n天总共可以量产的手机数量。
例:
输入:11
输出:35
时间限制:C/C++ 1秒,其他语言2秒; 空间限制:C/C++ 256M,其他语言512M
敝人方案
public static int productionResult(int n) {
int res = 0;
int totalDays = 0; //累计天数
int i = 1; //产量,随天数变化
for( ; totalDays + i <= n; i++) {
res = res + i*i;
totalDays += i;
}
res += i*(n - totalDays);
return res;
}
第二题:数位之积
题干
现给定任意正整数 n,请寻找并输出最小的正整数 m(m>9),使得 m 的各位(个位、十位、百位 … …)之乘积等于n,若不存在则输出 -1。
例1:
输入:36
输出:49
例2:
输入:100
输出:455
时间限制:C/C++ 1秒,其他语言2秒; 空间限制:C/C++ 256M,其他语言512M
敝人方案
public static int findNumber(int n) {
StringBuilder reString = new StringBuilder(); //用于储存结果
if(n < 10)
return -1;
else {
if(find(n, reString)) {
reString.reverse(); //得到结果,反转后就是最小数
return Integer.parseInt(reString.toString());
}else
return -1;
}
}
//递归寻找,找到返回true,未找到返回false
public static boolean find(int n, StringBuilder res) {
for(int i = 9 ;i > 1; i--) {
int remain = n % i; //余数
int quot = n / i; //商
//若余数为0,商不为1,则表示整除成功,且n>9
if(remain == 0 && quat != 1) {
res.append(i);
if(find(quat, res)) //将商和字符串作为递归参数
return true;
else
return false;
}
//若余数为0,商为1,则表示n<9,查找完成
if(remain == 0 && quat == 1) {
res.append(i);
return true;
}
}
//若n不能被2~9整除,返回false
return false;
}
解题思路:
- 若能找到一个数m,它的各位数乘积等于n,则n可以被m的各位整除;
- 由于m的各位只能是2~9,所以n可以被2~9之间的整数整除,且n是由若干个2~9之间的整数相乘得到(不考虑1,是因为1在乘法中没有意义,且题中要求最小整数,由此可以不考虑1);
- 若 n < 10 直接返回 -1,因为此时对应的 m < 9,不符合题意;
- 若 n > 10 ,进行查找;
- 这里使用了递归来查找,也可以使用循环;
- 在查找过程中,首先从n可以被整除的最大值9开始找,若从2开始找,则可能存在可以被更大的数整除的情况,而被越大的数整除则意味着最后得到的结果越小。如 n = 24,可以被 2 整除,也可以被 3、4、6、8 整除,比较所有结果可以发现被 8 整除后得到 3,组成的整数 38,是最小的。
- 若递归查找返回结果为 false,主函数直接返回 -1;
- 若查找结果返回 true,则将查找过程中保存的 StringBuilder 先反转,再转化成 String,然后转化成 int 返回。(因为我在每次递归中找出的都是2~9中可以整除 n 的最大的数,所以得到的字符串中数字的排列是从大到小的,所有这里将其反转,可以得到最小的m)
敝人一枚菜鸡,若大侠们有更高效的解题思路,望指破迷津,留言告知
笔试还有第三题,将会在(下)篇中给出。
目前三道试题可以在牛客网上找到,链接如下:vivo2020届春季校园招聘在线编程考试
以上