八十二、Java算法练习打卡(三题)

简介: 八十二、Java算法练习打卡(三题)

题目一


题目描述

年龄巧合


本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。


小明和他的表弟一起去看电影,有人问他们的年龄。小明说:今年是我们的幸运年啊。我出生年份的四位数字加起来刚好是我的年龄。表弟的也是如此。已知今年是 2014 年,并且,小明说的年龄指的是周岁。


请推断并填写出小明的出生年份。


运行限制


最大运行时间:1s

最大运行内存: 128M


题解

public class Main {
  public static void main(String[] args) {
  for (int i = 2014; i > 1950; i--) {
    if ((2014 - i) == (i % 10 + (i / 10) % 10 + (i / 100) % 10 + (i / 1000) % 10))
    System.out.println(i);
  }
  }
}

注:确定区间(1950,2014),结果为2006,1988,他是我表弟,故为2006年出生


答案:    我 :1988  他 :2006


题目二


题目描述

纸牌三角形


本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。


A,2,3,4,5,6,7,8,9共 9 张纸牌排成一个正三角形(A 按 1 计算)。要求每个边的和相等。 下图就是一种排法。


20.png



这样的排法可能会有很多。


如果考虑旋转、镜像(对称)后相同的算同一种,一共有多少种不同的排法呢?


请你计算并提交该数字。


运行限制


最大运行时间:1s

最大运行内存: 256M


题解

public class Main {
  static int ans = 0;
  static int[] A = new int[9];// 用来存数据
  static int[] B = new int[9];// 用来表示该数组的位置是否有被遍历过
  public static void main(String[] args) {
  dfs(0);
  // 因为旋转和镜像代表的是同一种,但是它们各重复三次,即重复六次,所以最后要除以六
  System.out.println(ans / 6);
  }
  public static void dfs(int num) {
  if (num == 9 && ((A[0] + A[1] + A[2] + A[3]) == (A[3] + A[4] + A[5] + A[6]))
    && ((A[3] + A[4] + A[5] + A[6]) == (A[6] + A[7] + A[8] + A[0]))) {
    ans++;
    return;
  }
  for (int i = 0; i < 9; i++) {
    if (B[i] == 0) {
    A[num] = i + 1;// 对数组进行赋值
    B[i] = 1;// 表示该位置已经赋值
    dfs(num + 1);
    B[i] = 0;// 回溯
    }
  }
  }
}

注:dfs搜索,全排列,抓住三个要素最为关键


入口的参数设置

dfs的出口设置

是否需要回溯

答案:144


题目三


题目描述

取球游戏


今盒子里有 n个小球,A、B 两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断。


我们约定:


每个人从盒子中取出的球的数目必须是:1,3,7 或者 8 个。轮到某一方取球时不能弃权!A 先取球,然后双方交替取球,直到取完。被迫拿到最后一个球的一方为负方(输方)


请编程确定出在双方都不判断失误的情况下,对于特定的初始球数,A 是否能赢?


输入描述

先是一个整数 n (n<100),表示接下来有 n 个整数。


然后是 n个整数,每个占一行(整数< 10^4),表示初始球数。


输出描述

程序则输出 n 行,表示 A 的输赢情况(输为 0,赢为 1)。


输入样例

4
1
2
10
18

输出样例

0
1
1
0

运行限制


最大运行时间:1s

最大运行内存: 256M


题解


(暴力求解)


import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
//类似于爬楼梯的递归模式
public class Main {
  public static void main(String[] args) {
  Scanner scanner = new Scanner(System.in);
  int n = scanner.nextInt();
  List<Integer> l = new ArrayList<>();
  for (int i = 0; i < n; i++) {
    l.add(scanner.nextInt());
  }
  for (int j = 0; j < n; j++) {
    if (A(l.get(j))) {
    System.out.println(1);
    } else {
    System.out.println(0);
    }
  }
  }
  public static boolean A(int m) {
  if (m >= 1) {
    switch (m) {
    case 1:
    return false;// 当你要去拿球时,并且最后只剩下1个球时,输
    case 3:
    return false;// 当你要去拿球时,并且最后只剩下3个球时,输
    case 7:
    return false;// 输
    case 8:
    return true;// 赢
    default:
    return (!A(m - 1) || !A(m - 3) || !A(m - 7) || !A(m - 8));// 这个时候表示自己拿1或3或7或8个球,然后这时对象变成了对面的一个人,所以要加!
    }
  }
  return false;
  }
}

(dp求解)


import java.util.Scanner;
//dp解法
public class Main {
  public static void main(String[] args) {
  Scanner scanner = new Scanner(System.in);
  int n = scanner.nextInt();
  boolean[] A = new boolean[10009];// 因为n<10^4
  A[0] = true;
  for (int i = 1; i < 10009; i++) {
    A[i] = (!(A[i - 1]) || (i >= 3 && !A[i - 3]) || (i >= 7 && !A[i - 7]) || (i >= 8 && !A[i - 8]));// 这个时候表示自己拿1或3或7或8个球,然后这时对象变成了对面的一个人,所以要加!
  }
  // 为了方便输出
  int[] B = new int[n + 1];
  for (int i = 1; i <= n; i++) {
    int j = scanner.nextInt();
    if (!A[j]) {
    B[i] = 0;
    } else {
    B[i] = 1;
    }
  }
  for (int k = 1; k <= n; k++) {
    System.out.println(B[k]);
  }
  }
}

暴力求解:代码冗余,重复率较高,显得笨重且繁琐


dp求解:结果只有两种 ,他赢或我赢,是非的关系,用“||”来选择四种取法,表示只要有一种取法能够赢,那我最后就是赢的,取法都是最优值。


eg:4个球


1,1,1,1(我输了)


3,1(我赢了)


遍历计算结果,进行累计


相关文章
|
2月前
|
负载均衡 NoSQL 算法
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
这篇文章是关于Java面试中Redis相关问题的笔记,包括Redis事务实现、集群方案、主从复制原理、CAP和BASE理论以及负载均衡算法和类型。
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
|
2月前
|
搜索推荐 算法 Java
手写快排:教你用Java写出高效排序算法!
快速排序(QuickSort)是经典的排序算法之一,基于分治思想,平均时间复杂度为O(n log n),广泛应用于各种场合。在这篇文章中,我们将手写一个Java版本的快速排序,从基础实现到优化策略,并逐步解析代码背后的逻辑。
90 1
|
2天前
|
算法 Java 测试技术
数据结构 —— Java自定义代码实现顺序表,包含测试用例以及ArrayList的使用以及相关算法题
文章详细介绍了如何用Java自定义实现一个顺序表类,包括插入、删除、获取数据元素、求数据个数等功能,并对顺序表进行了测试,最后还提及了Java中自带的顺序表实现类ArrayList。
5 0
|
2月前
|
设计模式 缓存 算法
揭秘策略模式:如何用Java设计模式轻松切换算法?
【8月更文挑战第30天】设计模式是解决软件开发中特定问题的可重用方案。其中,策略模式是一种常用的行为型模式,允许在运行时选择算法行为。它通过定义一系列可互换的算法来封装具体的实现,使算法的变化与客户端分离。例如,在电商系统中,可以通过定义 `DiscountStrategy` 接口和多种折扣策略类(如 `FidelityDiscount`、`BulkDiscount` 和 `NoDiscount`),在运行时动态切换不同的折扣逻辑。这样,`ShoppingCart` 类无需关心具体折扣计算细节,只需设置不同的策略即可实现灵活的价格计算,符合开闭原则并提高代码的可维护性和扩展性。
45 2
|
2月前
|
安全 算法 Java
java系列之~~网络通信安全 非对称加密算法的介绍说明
这篇文章介绍了非对称加密算法,包括其定义、加密解密过程、数字签名功能,以及与对称加密算法的比较,并解释了非对称加密在网络安全中的应用,特别是在公钥基础设施和信任网络中的重要性。
|
2月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
40 6
|
2月前
|
搜索推荐 算法 Java
经典排序算法之-----选择排序(Java实现)
这篇文章通过Java代码示例详细解释了选择排序算法的实现过程,包括算法的基本思想、核心代码、辅助函数以及测试结果,展示了如何通过选择排序对数组进行升序排列。
经典排序算法之-----选择排序(Java实现)
|
2月前
|
搜索推荐 算法 Java
|
2月前
|
存储 算法 Java
LeetCode经典算法题:打家劫舍java详解
LeetCode经典算法题:打家劫舍java详解
56 2
|
2月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
43 1