1. 平方末尾

能够表示为某个整数的平方的数字称为“平方数” 比如,25,64 虽然无法立即说出某个数是平方数,但经常可以断定某个数不是平方数。 因为平方数的末位只可能是:[0, 1, 4, 5, 6, 9] 这6个数字中的某个。 所以,4325435332必然不是平方数。 如果给你一个2位或2位以上的数字,你能根据末位的两位来断定它不是平方数吗? 请计算一下,一个2位以上的平方数的最后两位有多少种可能性?

思路分析:

  1. 先创建Set集合,用于存储和统计可能性
    • Set集合可以去重
  2. 因为是否为平方数,只和末尾两位有关系,所以我们只需要验证 10~100的平方即可 ```java public class 平方末尾 {

    public static void main(String[] args) {

    1. Set<String> set = new HashSet<>();//创建set集合
    2. //在10 ~100的平方找出末两位
    3. for(int i = 10;i<100;i++){
    4. int length = String.valueOf(i * i).length();//获取平方数的长度
    5. String str = String.valueOf(i*i).substring(length-2,length);//截取平方数的末尾两位 100 sub(3-2=1) (1,3)
    6. set.add(str);//统计末尾两位数的情况.
    7. }
    8. System.out.println(set.size());

    }

}

  1. <a name="04RyQ"></a>
  2. # 2. 全排列问题
  3. > 有ABCDE五个字母,他们之间一共可以组成多少种顺序不同的组合(字母不能重复)
  4. <a name="eMAcP"></a>
  5. ## 思路分析
  6. ```java
  7. import java.util.Stack;
  8. /**
  9. * abc 多少种组合排序
  10. */
  11. public class _C全排列 {
  12. static int count = 0; //用于记录有多少种组合
  13. public static void main(String[] args) {
  14. //创建数组用于存放abcde
  15. char c[] = new char[3];
  16. //创建一个bool类型数据,用于标记 a b c d e是否
  17. boolean b[] = new boolean[c.length];
  18. f(0,c,b);
  19. }
  20. public static void f(int step,char c[],boolean b[]){
  21. if(step == 3){ //等于5时说明完成一次组合
  22. //打印数组
  23. for(char c1:c){
  24. System.out.print(c1+" ");
  25. }
  26. System.out.println();
  27. count++;
  28. }
  29. //循环遍历组合
  30. for(int i =0;i<c.length;i++){ //
  31. if(!b[i]){ //如果某一位还没有被选中过
  32. c[step] = (char) (i+'a');
  33. b[i] = true; //被选中过,标记为true
  34. f(step+1,c,b);
  35. b[i] = false;//回溯
  36. }
  37. }
  38. }
  39. }

3. 背包问题(动态规划)

  1. package com.atguo.demo;
  2. /**
  3. * 01背包问题的描述:
  4. * 有编号分别为a,b,c,d,e的五件物品,
  5. * 它们的重量分别是2,2,6,5,4,
  6. * 它们的价值分别是6,3,5,4,6,
  7. * 现在给你个承重为10的背包,如何让背包里装入的物品具有最大的价值总和?
  8. */
  9. public class DpATest {
  10. static int f[][] = new int[5][9];
  11. static int w[] = {0,2,3,4,5};
  12. static int v[] = {0,3,4,5,8};
  13. public static void main(String[] args) {
  14. for(int i = 1;i<5;i++){ //i件物品
  15. for(int j = 1;j<9;j++){ //j:背包的容量
  16. if(w[i]>j){
  17. f[i][j] = f[i-1][j];
  18. }else{
  19. f[i][j] = Math.max(f[i-1][j],f[i-1][j-w[i]]+v[i]);
  20. }
  21. }
  22. }
  23. for(int i = 1;i<5;i++){
  24. System.out.println();
  25. for(int j = 1;j<9;j++){ //j:背包的容量
  26. System.out.print(f[i][j]+" ");
  27. }
  28. }
  29. System.out.println(f[4][8]);
  30. }
  31. }

4. 年龄问题(简单遍历)

  1. /**
  2. * s夫人一向很神秘。这会儿有人问起她的年龄,她想了想说:
  3. * “20年前,我丈夫的年龄刚好是我的2倍,而现在他的年龄刚好是我的1.5倍”。
  4. * 你能算出s夫人现在的年龄吗?
  5. */
  6. public class _01年龄问题 {
  7. public static void main(String[] args) {
  8. for(int i = 1;i<100;i++){
  9. for(int j = 1;j<100;j++){
  10. if((i-20) == (j-20)*2 && i == j*1.5 ){
  11. System.out.println(i+" "+j);
  12. }
  13. }
  14. }
  15. }

5. 奇数倍数

  1. /**
  2. * 请你找到最小的整数 X 同时满足:
  3. * • X 是 2019 的整倍数
  4. * • X 的每一位数字都是奇数
  5. * 【答案提交】
  6. * 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
  7. * 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
  8. */
  9. public class _A奇数倍数 {
  10. public static void main(String[] args) {
  11. int x = 2019;
  12. while (true){
  13. if(f(x)){
  14. System.out.println(x);
  15. return;
  16. }
  17. x+=2019;
  18. }
  19. }
  20. //比较个位数
  21. public static boolean f(int n ){
  22. int x = n;
  23. while (x!=0){
  24. if(f1(x%10)){//如果有一个偶数
  25. return false;
  26. }
  27. x/= 10;
  28. }
  29. return true;
  30. }
  31. public static boolean f1(int n1){
  32. return (n1&1)!=1;//偶数返回true
  33. }
  34. }

6. 七星末尾(回溯)

  1. package com.atguo.demo2016;
  2. import java.util.HashSet;
  3. import java.util.Set;
  4. /**
  5. * 能够表示为某个整数的平方的数字称为“平方数”
  6. * 比如,25,64
  7. * 虽然无法立即说出某个数是平方数,但经常可以断定某个数不是平方数。
  8. * 因为平方数的末位只可能是:[0, 1, 4, 5, 6, 9] 这6个数字中的某个。
  9. * 所以,4325435332必然不是平方数。
  10. *
  11. * 如果给你一个2位或2位以上的数字,你能根据末位的两位来断定它不是平方数吗?
  12. *
  13. * 请计算一下,一个2位以上的平方数的最后两位有多少种可能性?
  14. */
  15. public class 平方末尾 {
  16. public static void main(String[] args) {
  17. Set<String> set = new HashSet<>();//创建set集合
  18. //在10 ~100的平方找出末两位
  19. for(int i = 10;i<10000;i++){
  20. int length = String.valueOf(i * i).length();//获取平方数的长度
  21. String str = String.valueOf(i*i).substring(length-2,length);//截取平方数的末尾两位 100 sub(3-2=1) (1,3)
  22. set.add(str);//统计末尾两位数的情况.
  23. }
  24. System.out.println(set.size());
  25. }
  26. }