算法-称硬币(枚举-java)

简介: 算法-称硬币(枚举-java)

前言

来自编者的话:或许这段日子会很苦,想停下去,但是咬牙坚持下去,一定会有所收获。


一、题目描述

有12枚硬币。其中有11枚真币和1枚假币。假币和真币重量不同, 但不知道假币比真币轻还是重。现在用一架天平称了这些币三次,告诉你称的结果,请你找出假币并且确定假币是轻是重(数据保证一能找出来)。


输入

第一行是测试数据组数。

每组数据有三行,每行表示一次称量的结果。银币标号为A-L。每次称量的结果用三个以空格隔开的字符串表示:天平左边放置的硬币,天平右边放置的硬币平衡状态。其中平衡状态用"up",“down”,或"even"表示, 分别为右端高、右端低和平衡。天平左右的硬币数总是相等的。


输出

输出哪一个标号的银币是假币,并说明它比真币轻还是重。


输入样例

1

ABCD EFGH even

ABCI EFJK up

ABIJ EFGH even


输出样例

K is the counterfeit coin and it is light.


二、解题思路

1.简化并理解题意

这一点十分重要,要学会简化题意。

十二枚硬币(A-L)中有一枚假币,不知道轻还是重,现在告诉你三次测量的结果,找出假币并确定轻重。题上给了一组测量结果,并且平衡状态都是根据天平右边做出判断,所以要以右边为主对象,并且结果要用字符串表示,最终结果是输入题上案例,并获得正确答案,所有不要忘记写输入这一块的代码。


2.思考方向

借助数组来存输入的字符和显示的结果;使用枚举法,全部12枚硬币都试,对每一枚硬币先假设是假且轻,然后带入三次称量结果中,不符合的话,就假设硬币是假币且重,看看是否符合称量结果。


代码展示:

import java.util.Scanner;
//称硬币
public class class1 {
  static String content[][] = new String [3][3]; //创建一个用来存储输入字符的二位数组 行表示字符 列表示 结果 
  public static void main(String[]args) {
    Scanner s = new Scanner(System.in);
    int group = s.nextInt(); //group表示所测量的组数 例输入1  则表示代表第一组测量  需要输入三串字符 三个结果
    while(group-->0) {
      for(int i = 0;i<3;i++) 
        for(int j = 0;j<3;j++) 
          content[i][j]=s.next(); // 从键盘读取所输入的字符 行表示字母例ABCD 列表示结果例even
      //从A开始到L,开始假设目标硬币硬币是假
      for(char c ='A';c<='L';c++) { //大写字母编码是从65-90,即可以通过+1,来实现字母的变化
        String a = String.valueOf(c); //将字符型改成字符串类型
        if(isfake(content, a, true)) {
          System.out.println(a+" is the counterfeit coin and it is light");
          break;
        }else if(isfake(content, a, false)) {
          System.out.println(a+" is the counterfeit coin and it is heavy");
          break;
        }
      }
    }
  }
  //下面是主要判断方法 对于目标硬币 假设该硬币为假且轻
  static boolean isfake(String[][]content1,String c,boolean light) {
    //把假设带入三次称量结果 看是否矛盾
    for(int i =0 ;i<3;i++) {
      String l = null;
      String r = null;
      if(light==true) {
        l = content1[i][0];
        r = content1[i][1];
      }else {
        l = content1[i][1];
        r = content1[i][0];
      }
      switch (content1[i][2]) {
      case "up":
        if(r.contains(c)==false)
          return false;
        break;
      case "even":
        if(r.contains(c)==true || l.contains(c) == true)
          return false;
        break;
      case "down":
        if(l.contains(c)==false)
          return false;
        break;
      }
    }
    return true; //首先给light返回一个true值
  }
}
帮助理解:就拿当假币为A时举例,首先 进入isfake方法中,默认为true,将l=ABCD r=EFGH,结果为even,进入switch循环中,判断存在,return false终止函数,重新返回到主函数中,由于light没有返回值,矛盾,所以默认进行下一个字符。
当轮到假币K时,进入isfake中返回值为true,所以最终确定假币,假设成功,为轻。


目的

学会从题意着手,熟练使用枚举。

参考文章:C语言版解法

相关文章
|
1天前
|
算法 Java
Java中CAS算法的集中体现:Atomic原子类库,你了解吗?
【5月更文挑战第15天】Java中CAS算法的集中体现:Atomic原子类库,你了解吗?
12 1
|
3天前
|
算法 搜索推荐 Java
滚雪球学Java(33):数组算法大揭秘:应用案例实战分享
【5月更文挑战第8天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
31 8
滚雪球学Java(33):数组算法大揭秘:应用案例实战分享
|
5天前
|
缓存 算法 Java
数据结构~缓存淘汰算法--LRU算法(Java的俩种实现方式,万字解析
数据结构~缓存淘汰算法--LRU算法(Java的俩种实现方式,万字解析
|
5天前
|
NoSQL 算法 Java
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
|
7天前
|
搜索推荐 算法 Java
滚雪球学Java(29):数组长度和排序算法:让你的程序更高效
【5月更文挑战第4天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
13 0
滚雪球学Java(29):数组长度和排序算法:让你的程序更高效
|
7天前
|
Java 索引
Java开发指南 | 第三十篇】Java 枚举(enum)
Java开发指南 | 第三十篇】Java 枚举(enum)
10 1
|
7天前
|
Java 索引
Java 枚举(enum)
5月更文挑战第7天
|
7天前
|
算法 安全 Java
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
【4月更文挑战第28天】性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
36 1
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
|
7天前
|
缓存 Java 开发者
如何高效优雅的使用java枚举
本文通过几种样例展示如何高效优雅的使用java枚举消除冗余代码。
|
7天前
|
安全 Java 编译器
Java枚举(enum)
Java枚举(enum)
31 0