赞
踩
在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.println(Arrays.toString(result)); }
现给定任意正整数 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; }
有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是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{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()){
int n = scanner.nextInt();
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){ return 0; } if(n ==2 || n== 3){ return 1; } return demo6(n-2)+1; } }
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作(同一个测试用例里可能会有多组数据,希望大家能正确处理)。
思路:
这就是考察去重+排序
Scanner scanner = new Scanner(System.in); int[] numbers = new int[1000]; while (scanner.hasNextInt()) { for (int number : numbers) { number = 0; }//初始化。因为一次排序之后有残余 int n = scanner.nextInt();//次数 for (int i = 0; i < n; i++) { //按照桶排序 int i1 = scanner.nextInt(); numbers[i1] = i1; } for (int number : numbers) { if (number != 0) { System.out.println(number); } } }
链接:https://www.nowcoder.com/questionTerminal/3245215fffb84b7b81285493eae92ff0 来源:牛客网 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 = scanner.nextInt();//次数 for (int i = 0; i < n; i++) { int i1 = scanner.nextInt(); numbers.add(i1);//在添加的时候已经拍好序 } for (int number : numbers) { System.out.println(number); } } } }
写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。(多组同时输入 )
输入:0xA
输出:10
思路
这里不是简单的一个parseInt就可以结束的,如果是超级超级大的数字,int或者long根本就放不下
public static void demo6() { /* 如果输入是substring十六进制 那么 // System.out.println("Long.parseLong: " + Long.parseLong(s, 16));//这个就会报错。因为超出可限制 */ String substring = "0x1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"; String s = substring.substring(2); //去掉前面的0x。左开右闭 //这里并不是简单的一个格式转换就好了,这里要考虑超大数字的转换 ArrayList<Integer> integers = new ArrayList<>(); //存放各个位置对应的十进制 for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); int a = Integer.parseInt(c + "", 16);//变为十进制 integers.add(a); } System.out.println(Arrays.toString(integers.toArray())); BigDecimal sum = new BigDecimal(0); //这个比较好 int j = 0; for (int i = integers.size() - 1; i >= 0; i--) { long v = (long) (integers.get(i) * Math.pow(16, j++)); sum = sum.add(new BigDecimal(v)); } System.out.println("BigDecimal: " + sum);//这个就不会 // System.out.println("Long.parseLong: " + Long.parseLong(s, 16));//这个就会报错。因为超出可限制 }
有一个数组a[N]顺序存放0~N-1,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以8个数(N=7)为例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删除)->6->7->0(删除),如此循环直到最后一个数被删除。
这个题的解法在我的数据结构面试题和常用算法(1)
每组数据输入一个字符串,字符串最大长度为100,且只包含字母,不可能为空串,区分大小写。
输入:
abcqweracb
输出:
abcqwer
思路:
- 遍历 如果相等就让后一个变为; 输入的时候判断一哈就好
- 利用set去重
public static void main(String[] args){ Scanner scanner = new Scanner(System.in); while (scanner.hasNext()){ String next = scanner.next(); char[] chars = next.toCharArray(); for (int i = 0; i < chars.length; i++) { for (int j = i+1; j < chars.length; j++) { if(chars[i]!=';' && chars[j] != ';'){ if(chars[i] == chars[j]){ chars[j] = ';'; } } } } for (char aChar : chars) { if (aChar != ';'){ System.out.print(aChar); } } } }
import java.util.HashSet; import java.util.Scanner; import java.util.Set; public class Main{ public static void main(String[] args){ Scanner in = new Scanner(System.in); while(in.hasNext()){ char[] c = in.next().toCharArray(); StringBuffer sb = new StringBuffer(); Set<Character> set = new HashSet<Character>(); for(int i = 0;i<c.length;i++){ if(set.add(c[i])) sb.append(c[i]); } System.out.println(sb.toString()); } } }
数独是一个我们都非常熟悉的经典游戏,运用计算机我们可以很快地解开数独难题,现在有一些简单的数独题目,请编写一个程序求解。
这个题我还没有怎么懂。后续更新
import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc=new Scanner(System.in); while(sc.hasNext()){ int[][] data=new int[9][9]; ArrayList<HashSet<Integer>> row=new ArrayList<HashSet<Integer>>(); ArrayList<HashSet<Integer>> col=new ArrayList<HashSet<Integer>>(); ArrayList<HashSet<Integer>> squ=new ArrayList<HashSet<Integer>>(); for(int i=0;i<9;i++){ row.add(new HashSet<Integer>()); col.add(new HashSet<Integer>()); squ.add(new HashSet<Integer>()); } for(int i=0;i<9;i++){ for(int j=0;j<9;j++){ data[i][j]=sc.nextInt(); if(data[i][j]!=0){ row.get(i).add(data[i][j]); col.get(j).add(data[i][j]); squ.get(i/3*3+j/3).add(data[i][j]); } } } dfs(data,row,col,squ,0); for(int i=0;i<9;i++){ for(int j=0;j<9;j++){ if(j!=8) System.out.print(data[i][j]+" "); else System.out.println(data[i][j]); } } } sc.close(); } public static boolean dfs(int[][] data,ArrayList<HashSet<Integer>> row,ArrayList<HashSet<Integer>> col,ArrayList<HashSet<Integer>> squ,int index){ if(index==81) return true; int m=index/9; int n=index%9; int k=m/3*3+n/3; if(data[m][n]!=0){ return dfs(data,row,col,squ,index+1); } else{ for(int i=1;i<=9;i++){ if(!row.get(m).contains(i) && !col.get(n).contains(i) && !squ.get(k).contains(i)){ data[m][n]=i; row.get(m).add(i); col.get(n).add(i); squ.get(k).add(i); if(dfs(data,row,col,squ,index+1)) return true; data[m][n]=0; row.get(m).remove(i); col.get(n).remove(i); squ.get(k).remove(i); } } return false; } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。