八十二、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(我赢了)


遍历计算结果,进行累计


相关文章
|
4月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
4月前
|
存储 缓存 监控
上网行为监控系统剖析:基于 Java LinkedHashMap 算法的时间序列追踪机制探究
数字化办公蓬勃发展的背景下,上网行为监控系统已成为企业维护信息安全、提升工作效能的关键手段。该系统需实时记录并深入分析员工的网络访问行为,如何高效存储和管理这些处于动态变化中的数据,便成为亟待解决的核心问题。Java 语言中的LinkedHashMap数据结构,凭借其独有的有序性特征以及可灵活配置的淘汰策略,为上网行为监控系统提供了一种兼顾性能与功能需求的数据管理方案。本文将对LinkedHashMap在上网行为监控系统中的应用原理、实现路径及其应用价值展开深入探究。
101 3
|
4月前
|
人工智能 算法 NoSQL
LRU算法的Java实现
LRU(Least Recently Used)算法用于淘汰最近最少使用的数据,常应用于内存管理策略中。在Redis中,通过`maxmemory-policy`配置实现不同淘汰策略,如`allkeys-lru`和`volatile-lru`等,采用采样方式近似LRU以优化性能。Java中可通过`LinkedHashMap`轻松实现LRUCache,利用其`accessOrder`特性和`removeEldestEntry`方法完成缓存淘汰逻辑,代码简洁高效。
182 0
|
3月前
|
存储 算法 安全
Java中的对称加密算法的原理与实现
本文详细解析了Java中三种常用对称加密算法(AES、DES、3DES)的实现原理及应用。对称加密使用相同密钥进行加解密,适合数据安全传输与存储。AES作为现代标准,支持128/192/256位密钥,安全性高;DES采用56位密钥,现已不够安全;3DES通过三重加密增强安全性,但性能较低。文章提供了各算法的具体Java代码示例,便于快速上手实现加密解密操作,帮助用户根据需求选择合适的加密方案保护数据安全。
332 58
|
2月前
|
存储 负载均衡 算法
我们来说一说 Java 的一致性 Hash 算法
我是小假 期待与你的下一次相遇 ~
|
9月前
|
监控 算法 网络协议
Java 实现局域网电脑屏幕监控算法揭秘
在数字化办公环境中,局域网电脑屏幕监控至关重要。本文介绍用Java实现这一功能的算法,涵盖图像采集、数据传输和监控端显示三个关键环节。通过Java的AWT/Swing库和Robot类抓取屏幕图像,使用Socket进行TCP/IP通信传输图像数据,并利用ImageIO类在监控端展示图像。整个过程确保高效、实时和准确,为提升数字化管理提供了技术基础。
189 15
|
8月前
|
存储 算法 安全
探究‘公司禁用 U 盘’背后的哈希表算法与 Java 实现
在数字化办公时代,信息安全至关重要。许多公司采取“禁用U盘”策略,利用哈希表算法高效管理外接设备的接入权限。哈希表通过哈希函数将设备标识映射到数组索引,快速判断U盘是否授权。例如,公司预先将允许的U盘标识存入哈希表,新设备接入时迅速验证,未授权则禁止传输并报警。这有效防止恶意软件和数据泄露,保障企业信息安全。 代码示例展示了如何用Java实现简单的哈希表,模拟公司U盘管控场景。哈希表不仅用于设备管理,还在文件索引、用户权限等多方面助力信息安全防线的构建,为企业数字化进程保驾护航。
|
2月前
|
存储 监控 算法
企业上网监控场景下布隆过滤器的 Java 算法构建及其性能优化研究
布隆过滤器是一种高效的数据结构,广泛应用于企业上网监控系统中,用于快速判断员工访问的网址是否为违规站点。相比传统哈希表,它具有更低的内存占用和更快的查询速度,支持实时拦截、动态更新和资源压缩,有效提升系统性能并降低成本。
58 0
|
5月前
|
存储 机器学习/深度学习 监控
如何监控员工的电脑——基于滑动时间窗口的Java事件聚合算法实现探析​
在企业管理场景中,如何监控员工的电脑操作行为是一个涉及效率与合规性的重要课题。传统方法依赖日志采集或屏幕截图,但数据量庞大且实时性不足。本文提出一种基于滑动时间窗口的事件聚合算法,通过Java语言实现高效、低资源占用的监控逻辑,为如何监控员工的电脑提供一种轻量化解决方案。
124 3
|
7月前
|
存储 算法 Java
解锁“分享文件”高效密码:探秘 Java 二叉搜索树算法
在信息爆炸的时代,文件分享至关重要。二叉搜索树(BST)以其高效的查找性能,为文件分享优化提供了新路径。本文聚焦Java环境下BST的应用,介绍其基础结构、实现示例及进阶优化。BST通过有序节点快速定位文件,结合自平衡树、多线程和权限管理,大幅提升文件分享效率与安全性。代码示例展示了文件插入与查找的基本操作,适用于大规模并发场景,确保分享过程流畅高效。掌握BST算法,助力文件分享创新发展。

热门文章

最新文章