vivo2020春招笔试编程题 java实现(上)

第一题: 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;
}

解题思路:

  1. 若能找到一个数m,它的各位数乘积等于n,则n可以被m的各位整除;
  2. 由于m的各位只能是2~9,所以n可以被2~9之间的整数整除,且n是由若干个2~9之间的整数相乘得到(不考虑1,是因为1在乘法中没有意义,且题中要求最小整数,由此可以不考虑1);
  3. 若 n < 10 直接返回 -1,因为此时对应的 m < 9,不符合题意;
  4. 若 n > 10 ,进行查找;
  5. 这里使用了递归来查找,也可以使用循环;
  6. 在查找过程中,首先从n可以被整除的最大值9开始找,若从2开始找,则可能存在可以被更大的数整除的情况,而被越大的数整除则意味着最后得到的结果越小。如 n = 24,可以被 2 整除,也可以被 3、4、6、8 整除,比较所有结果可以发现被 8 整除后得到 3,组成的整数 38,是最小的。
  7. 若递归查找返回结果为 false,主函数直接返回 -1;
  8. 若查找结果返回 true,则将查找过程中保存的 StringBuilder 先反转,再转化成 String,然后转化成 int 返回。(因为我在每次递归中找出的都是2~9中可以整除 n 的最大的数,所以得到的字符串中数字的排列是从大到小的,所有这里将其反转,可以得到最小的m)

敝人一枚菜鸡,若大侠们有更高效的解题思路,望指破迷津,留言告知

笔试还有第三题,将会在(下)篇中给出。
目前三道试题可以在牛客网上找到,链接如下:vivo2020届春季校园招聘在线编程考试

以上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值