class Solution { public int[] swapNumbers(int[] numbers) { int[] a=new int[2]; a[0]=numbers[1]; //原来第二个数到第一个 a[1]=numbers[0]; //原来第一个数到第二个 return a; } }
结果
面试16.05 阶乘尾数(大数乘法/5的因数)
题目
分析
1. 先计算出阶乘的值 然后按位输出判断0的个数
2. 判断5的因数个数(多少个数字能整除5)
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
public class JieChengWeiShu { public static void main(String[] args) { Scanner input = new Scanner(System.in); int n=input.nextInt(); System.out.println(trailingZeroes(n)); }
public static int trailingZeroes(int n) { int ans=0; while(n>0){ ans+=n/5; //不断的/5求次数 n/=5; } return ans; }
public class ErCiShu { public static void main(String[] args) { Scanner input = new Scanner(System.in); int n=input.nextInt(); int jie=0; for(int i=1;i<=n;i++){ //从1到n都调用方法得到结果 jie+=numberOf2sInRange(i); } System.out.println(jie); }
public static int numberOf2sInRange(int n) { int ci=0; //记录2的个数 int m=1; while (n != 0) { m = n % 10; if (m == 2) { ci++; //每一位是2就ci++计数 } n = n / 10; } return ci; }
public class DiKShu { public static void main(String[] args) { Scanner input = new Scanner(System.in); int n=input.nextInt(); System.out.println(getKthMagicNumber(n)); }
public class JianShengZi { public static void main(String[] args) { Scanner input = new Scanner(System.in); int n=input.nextInt(); System.out.println(cuttingRope(n)); }
public static int cuttingRope(int n) { if(n <= 3) { return n - 1; //必须剪出一段长度为1的绳子 } int a=n/3; int b=n%3; //n=3a*b if(b==0){ return (int)Math.pow(3, a); //3的a次方 } if(b==1){ return (int)Math.pow(3, a - 1) * 4; } return (int)Math.pow(3, a) * 2; // 3 3 5(45) <<< 3 4 4(3*4*4=48) }
}
结果
面试14-II 剪绳子(分情况讨论)
题目
分析
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14
class Solution { public int cuttingRope(int n) { if(n <= 3) return n - 1; int b = n % 3, p = 1000000007; long rem = 1, x = 3; for(int a = n / 3 - 1; a > 0; a /= 2) { if(a % 2 == 1) rem = (rem * x) % p; x = (x * x) % p; } if(b == 0) return (int)(rem * 3 % p); if(b == 1) return (int)(rem * 4 % p); return (int)(rem * 6 % p); } }
public interface YiDaoN { public static void main(String[] args) { Scanner input = new Scanner(System.in); int n=input.nextInt(); System.out.println(Arrays.toString(printNumbers(n))); }
public class Yi { public static void main(String[] args) { Scanner input = new Scanner(System.in); int n=input.nextInt(); int jie=0; for(int i=1;i<=n;i++){ //从1到n都调用方法得到结果 jie+=numberOf2sInRange(i); } System.out.println(jie); }
public static int numberOf2sInRange(int n) { int ci=0; //记录1的个数 int m=1; while (n != 0) { m = n % 10; if (m == 1) { ci++; //每一位是1就ci++计数 } n = n / 10; } return ci; }
public class ChouShu { public static void main(String[] args) { Scanner input = new Scanner(System.in); int n=input.nextInt(); System.out.println(nthUglyNumber(n)); }
public static int nthUglyNumber(int n) { int[] a=new int[n]; a[0]=1; int p2=0; int p3=0; int p5=0; for(int i=1;i<n;i++){ a[i]=Math.min(a[p2]*2,Math.min(a[p3]*3,a[p5]*5)); //就看哪个乘最小 放入当前位置 if(a[i]==a[p2]*2){ p2++; //哪个满足就要指针后移 为了下轮的判断 } if(a[i]==a[p3]*3){ p3++; } if(a[i]==a[p5]*5){ p5++; } }
public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); int n=input.nextInt(); //输入要判断的多大值 find(n); //调用方法返回结果 }
public class Main { public static void main(String[] args) { Scanner input=new Scanner(System.in); String s=input.nextLine(); System.out.println(zhuan(s)); }
public class Main { public static void main(String[] args) { Scanner input=new Scanner(System.in); int n=input.nextInt(); //输入10进制 System.out.println(find(n)); }
public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println(hammingDistance(1,4)); }
public static int hammingDistance(int x, int y) { int xor = x ^ y; // 0001异或0100 --> 0101就是5 System.out.println("异或结果"+xor); int distance = 0; //测量距离 while (xor != 0) { if (xor % 2 == 1) //不同的话就是异或的结果为1的地方 distance += 1; xor = xor /2; //变小 } return distance; //返回距离 }
}
结果
增减字符串匹配(双指针移动)
题目
分析
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
public static int[] diStringMatch(String s) { int n=s.length(); //获取字符串长度n int[] res=new int[n+1]; //结果长为n+1 //确定左右指针 int left=0; int right=n; for (int i = 0; i < n; i++) { char temp = s.charAt(i); //获取字符串当前字符 if (temp == 'I') { //递增 res[i]=left++; } if (temp == 'D') { //递减 res[i]=right--; } } res[n]=left; //最后一个n+1的位置没有判断 添加left进去 return res; }
结果
最长特殊序列I(判断字符串长度)
题目
分析
代码
1 2 3 4 5 6
public int findLUSlength(String a, String b) { if (a.equals(b)) return -1; //如果两个字符串相同 返回-1 return Math.max(a.length(), b.length()); //如果不相同就看谁的更长度更长了 }
public int numWaterBottles(int sum, int numExchange) { int total = sum; //首先将sum加入 while (sum >= numExchange) { //手里的酒瓶数 < 要兑换酒瓶数量 //change表示的是兑换成酒的数量 int change = sum / numExchange; //total再加上兑换的酒 total += change; //瓶子数量变为兑换成酒的数量加上没有兑换成酒的数量 sum = change + sum % numExchange; //更新手里的总数 } return total; }
//第一种 每一个斜对角线的hang-lie是相同的 // 将第一个hang-lie的元素存入map 后面判断错误返回false public boolean isToeplitzMatrix(int[][] matrix) { Map<Integer, Integer> groups = new HashMap(); for (int r = 0; r < matrix.length; ++r) { for (int c = 0; c < matrix[0].length; ++c) { if (!groups.containsKey(r-c)) groups.put(r-c, matrix[r][c]); else if (groups.get(r-c) != matrix[r][c]) return false; // } } return true; }
//第二种 从(1,1)开始只是对照上一层的(i-1,j-1)元素 public boolean isToeplitzMatrix(int[][] matrix) { int column = matrix[0].length; for (int i = 1; i < matrix.length; i++) { for (int j = 1; j < column; j++) { if (matrix[i][j] != matrix[i - 1][j - 1]) return false; //如果不同就弹出false } } return true; }
public static int minMoves(int[] a) { Arrays.sort(a); //对a数组进行排序 int res=0; int count=a.length-1; //每次能够使n-1个元素增加1 for (int i = 0; i < a.length; i++) { res+=a[i]-a[0]; //计算比a【0】多多少 } return res; }