⽜客⽹编程题(1)
1. vivo第⼀题
在vivo产线上,每位职⼯随着对⼿机加⼯流程认识的熟悉和经验的增加,⽇产量也会不断攀升。
假设第⼀天量产1台,接下来2天(即第⼆、三天)每天量产2件,接下来3天(即第四、五、六天)每天量产3件 … …
以此类推,请编程计算出第n天总共可以量产的⼿机数量。
解析:
public static void demo1(){
int day =5;//求第5天中可以量产的⼿机
int[] result =new int[day +1];//定义产量集合,下标为1代表第⼀天产量,下标为2代表第⼆天产量。以此类推
int skip =1;//定义步长。即就是每次增加的多少。
int b =0;//计数器,⽤来计数是1天还是2天还是三天。因为这个和skip有关 1天skip就是1,2天skip就是2
for(int i =1; i <= day; i++){
//今天的产量等于前⼀题+步长
result[i]= result[i -1]+ skip;
b++;//计数器++
/*
要注意:
当b 和skip相等的时候说明skip要 ⼀天
*/
if(skip == b){
skip++;
b =0;//之后将skip规0,重新计数
}
}
System.out.String(result));
}
2. vivo第⼆题
现给定任意正整数 n,请寻并输出最⼩的正整数 m(m>9),使得 m 的各位(个位、⼗位、百位 … …)之乘积等于n,若不存在则输出 -1。
例⼦:
输⼊: 100
输出: 455
思路:
- 先想如果是⼈来做应该怎么做?
1. 求100的因⼦。也就是 A * B = 100 ,从 9 开始除,最后到是 除以 5 可能整除
2. 如果到这个数(题⽬中也就是20)继续这个数的因⼦,⼀直到⼩于9
3. 然后就是按照个位,⼗位,百位。拼接起来就好
- 同样计算机也是这样
⽤递归做
1. 先是好递归的出⼝,也就是 n < =9
2. 从9到1开始,那个数能被这个数整除。
3. 如果能整除,将这个数继续递归
4. 递归的结果*10 + 被整除的数(1-9之间)返回
/*
现给定任意正整数 n,请寻并输出最⼩的正整数 m(m>9),使得 m 的各位(个位、⼗位、百位 ... ...)之乘积等于n,若不存在则输出 -1。
*/
public static int demo2(int number){
//输⼊36 -------》输出49
//因为要最⼩的正整数个位要从9开始除。如果能整除。得到的商继续递归运算作为⾼位;
if(number <=9){
//递归出⼝
return number;
}
for(int i =9; i >1; i--){
if(number % i ==0){
//能整除
//⾼位继续递归
int gaowei = number / i;
int gaowei1 =demo2(gaowei);
return gaowei1 *10+ i;
}
}
return-1;
}
3. 华为2016 研发⼯程师(第⼀题)
有这样⼀道智⼒题:“某商店规定:三个空汽⽔瓶可以换⼀瓶汽⽔。⼩张⼿上有⼗个空汽⽔瓶,她最多可以换多少瓶汽⽔喝?”答案是5瓶,⽅法如下:先⽤9个空瓶⼦换3瓶汽⽔,喝掉3瓶满的,喝完以后4个空瓶⼦,⽤3个再换⼀瓶,喝掉这瓶满的,这时候剩2个空瓶⼦。然后你让⽼板先借给你⼀瓶汽⽔,喝掉这瓶满的,喝完以后⽤3个空瓶⼦换⼀瓶满的还给⽼板。如果⼩张⼿上有n个空汽⽔瓶,最多可以换多少瓶汽⽔喝?
思路:
有两种解题⽅式
- 数学归纳
经过写公式的推导,如果有n个空瓶⼦,就能换取n/2瓶汽⽔
- 递归求解
递归问题
3个瓶⼦换1瓶⽔+1个空瓶⼦,两个瓶⼦换1瓶⽔+0个空瓶⼦,1个瓶⼦换0瓶⽔。
f(1) = 0
f(2) = 1
f(3) = 1
f(4) = f(2)+1 //4个瓶⼦,其中3个可以换1瓶⽔+1个空瓶,所以是f(2)+1
f(5) = f(3)+1 //3个瓶⼦换1瓶⽔+1个空瓶,所以是f(3)+1
…
f(n) = f(n-2)+1
代码:
⽅法⼀:
import java.util.Scanner;
public class Main{
bigdecimal转换为integerpublic static void main(String[] args){
Scanner scanner =new Scanner(System.in);
while(scanner.hasNext()){
int n = Int();
System.out.println(n/2);
}
}
}
⽅法⼆
import java.util.Scanner;
public class Main{
public static void main(String[] args){
demo6(10)
}
public static int demo6(int n){
if(n ==1){
return0;
}
if(n ==2|| n==3){
return1;
}
return demo6(n-2)+1;
}
}
4. 华为2016 研发⼯程师(第⼆题)
明明想在学校中请⼀些同学⼀起做⼀项问卷调查,为了实验的客观性,他先⽤计算机⽣成了N个1到1000之间的随机整数
(N≤1000),对于其中重复的数字,只保留⼀个,把其余相同的数去掉,不同的数对应着不同的学⽣的学号。然后再把这些数从⼩到⼤排序,按照排好的顺序去同学做调查。请你协助明明完成“去重”与“排序”的⼯作(同⼀个测试⽤例⾥可能会有多组数据,希望⼤家能正确处理)。
思路:
这就是考察去重+排序
桶排序(空间换取时间)
TreeSet(Treeset底层使⽤⼆叉排序树做的)
先去重复,后排序
代码:
第⼀种
Scanner scanner =new Scanner(System.in);
int[] numbers =new int[1000];
while(scanner.hasNextInt()){
for(int number : numbers){
number =0;
}//初始化。因为⼀次排序之后有残余
int n = Int();//次数
for(int i =0; i < n; i++){
//按照桶排序
int i1 = Int();
numbers[i1]= i1;
}
for(int number : numbers){
if(number !=0){
System.out.println(number);
}
}
}
第⼆种
链接:wcoder/questionTerminal/3245215f ffb84b7b81285493eae92ff0
来源:⽜客⽹
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scanner =new Scanner(System.in);
TreeSet<Integer> numbers =new TreeSet<>();
while(scanner.hasNextInt()){
numbers.clear();//初始化。因为⼀次排序之后有残余
int n = Int();//次数
for(int i =0; i < n; i++){
int i1 = Int();
numbers.add(i1);//在添加的时候已经拍好序
}
for(int number : numbers){
System.out.println(number);
}
}
}
}
第三种(这就不写了)
5. 华为2016 研发⼯程师(第三题)
写出⼀个程序,接受⼀个⼗六进制的数,输出该数值的⼗进制表⽰。(多组同时输⼊ )
输⼊:0xA
输出:10
思路
这⾥不是简单的⼀个parseInt就可以结束的,如果是超级超级⼤的数字,int或者long根本就放不下
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论