牛客华为研发工程师编程题:https://www.nowcoder.com/test/1088888/summary
1、汽水瓶
-
题目:
某商店规定:三个空汽水瓶可以换一瓶汽水,允许向老板借空汽水瓶(但是必须要归还)。
小张手上有n个空汽水瓶,她想知道自己最多可以喝到多少瓶汽水。 -
思路:
除3取整和取余。如果最后只剩2个空瓶,这是特殊情况,可以借一瓶喝了,凑一瓶还他。
-
解答:
import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner sc = new Scanner(System.in); while(sc.hasNextLine()){ int n = sc.nextInt(); if(n == 0) break; int result = solution(n); System.out.println(result); } } private static int solution(int n){ int result = 0; while(n>=3){ result += n/3; // 此时有的汽水瓶,是喝后换回来的 加 还没有喝的 n = n/3 + n%3; } if(n==2){ result++; } return result; } }
2、明明的随机数
-
题目:
明明生成了N个1到500之间的随机整数。请你删去其中重复的数字,即相同的数字只保留一个,把其余相同的数去掉,然后再把这些数从小到大排序,按照排好的顺序输出。
-
思路1:
sort排序,然后去重——如果当前输入数组与输出数组的最后一个相同,则跳过 -
思路2:
使用集合set,treeset二叉树排序且不重复
TreeSet方法可参考:https://my.oschina.net/u/4265488/blog/3918220) -
解答1:
import java.util.Scanner; import java.util.*; public class Main{ public static void main(String[] args){ // 输入 Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int []inArray = new int[n]; for(int i=0;i<n;i++){ inArray[i] = sc.nextInt(); } // 排序 Arrays.sort(inArray); // 去重 int []outArray = new int[n]; for(int i=0,k=0;i<n;i++){ if(i==0){ outArray[k] = inArray[i]; System.out.println(outArray[k]); k++; }else{ if(inArray[i] == outArray[k-1]){ continue; }else{ outArray[k] = inArray[i]; System.out.println(outArray[k]); k++; } } } } }
-
解答2:
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(sc.hasNext()){ int num = sc.nextInt(); TreeSet<Integer> set = new TreeSet<>(); for(int i=0;i<num;i++){ set.add(sc.nextInt()); } for(Integer integer : set){ System.out.println(integer); } } } }
3、进制转换
-
题目:
写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。
-
思路1:
读出每一位,每一位读出后,最终值=之前值*16+当前值 -
思路2:
使用java自带的进制转换 -
解答1:
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); // 去除0x int sum = 0; String s = sc.next(); for(int i=2;i<s.length();i++){ char c = s.charAt(i); int n = 0; if(c<='E' && c>='A'){ n = c -'A' +10; }else{ n = c -'0' } sum = sum*16 +n; } System.out.println(sum); } }
-
解答2:
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); int sum = 0; String input = sc.next(); // 去除0x String ans = input.substring(2); // 也可以使用 // Integer.parseInt(ans, 16) System.out.println(Integer.valueOf(ans, 16)); } }
parselnt
跟valueof
区别?
① 返回值不同
parselnt返回值是int型
valueof返回值是Integer型
② valueof就是调用了parselnt方法的
③ parselnt效率比valueof效率高