黑马程序员——(活动二)哪个是假币



 

 ------- android培训java培训、期待与您交流! ----------

——————————————————————————————————————————————— 



题目:赛利有12枚银币,其中11枚真币。假币看起来和真币没有区别,但是重量不同。但赛利不知道假币比真币轻还是重。于是他向朋友借了一架天平。朋友希望赛利3次就能找出假币并且确定假币是轻还是重。例如,如果赛利用天平称两枚硬币,发现天平平稀,说明两枚都是真的。如果赛利用一枚真币与另一枚银币比较,发现它比真币轻或重,说明它是假币。请经过精心安排每次的称量,希望赛利按照您的策略称3次后确定假币。赛利事先将银币标号为A-L,其中平衡状态用“up”、“down”或“even”表示,分别为右端高、右端低和平衡。天平左右的硬币数总是相等的。输出哪一个标号的银币是假币,并说明它比真币轻还是重。样例输入1ABCD EFGH evenABCI EFJK upABIJ EFGH even样例输出K为假币,比真币轻.abcd efgh evenabci efjk upabij efgh even

 
 
 
 
package com.jie.act;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;


public class TrueFalseCoin {
	public static void main(String []args){
		String []str1 = null;
		String []str2 = null;
		String []str3 = null;
		
		System.out.println("输入的必须是标号为A-L,示例输入:"+"\r\n"+"abcd efgh even");
		
		
		for (int i = 0; i < 3; i++) {
			if (i==0) {
				System.out.println("请输入第一次的结果:");
				str1 = inmethod();
			}else if (i==1) {
				System.out.println("请输入第二次的结果:");
				str2 = inmethod();
			}else {
				System.out.println("请输入第三次的结果:");
				str3 = inmethod();
			}
		}
		String strinfo = disCoins(str1,str2,str3);
		System.out.println(strinfo);
	}
	
	public static String disCoins(String[] str1, String[] str2, String[] str3) {
		if(str1.length !=3||str2.length !=3||str3.length !=3){
			throw new RuntimeException("输入错误");
		}
		if (str1.length != str2.length) {
			throw new RuntimeException("前两个硬币个数应该相等。输入错误");
		}
//		设置一个记录假的银币
		char retValch = 0 ;
		String tf = null;
		Set<Character> set = new HashSet<Character>();
//		先将even的所有元素添加到集合中
		String []laststr = {str1[2],str2[2],str3[2]};
//		判断哪个是even的
		for (int i = 0; i < laststr.length; i++) {
			if(laststr[i].equalsIgnoreCase("even")){  //必须把所有even的元素都添加到集合中
//				如果是0元素就是str1的
				if(i==0){
					for (int j = 0; j < 2; j++) {
						char []chs = str1[j].toCharArray();
						for (int k = 0; k < chs.length; k++) {
							
							set.add(chs[k]);
						}
					}
				}
				if (i==1) {
					for (int j = 0; j < 2; j++) {
						char []chs = str2[j].toCharArray();
						for (int k = 0; k < chs.length; k++) {
							
							set.add(chs[k]);
						}
					}
				}
				if(i==2){
					for (int j = 0; j < 2; j++) {
						char []chs = str3[j].toCharArray();
						for (int k = 0; k < chs.length; k++) {
							set.add(chs[k]);
						}
					}
					
				}
			}
			
		}
		
		
		for (int i = 0; i < laststr.length; i++) {
			if(!laststr[i].equalsIgnoreCase("even")){
				if (i==0) {//第一次的硬币中有假币
					for (int j = 0; j < 2; j++) {
						char []chs = str1[j].toCharArray();
						for (int k = 0; k < chs.length; k++) {
							
							if(!set.contains(chs[k])){
								retValch = chs[k];
								tf = reqHT(laststr, i, j);
									
							}
						}
					}
				}
				if (i==1) {//第二次的硬币中有假币
					for (int j = 0; j < 2; j++) {
						char []chs = str2[j].toCharArray();
						for (int k = 0; k < chs.length; k++) {
							
							if(!set.contains(chs[k])){
								retValch = chs[k];
								tf = reqHT(laststr, i, j);
							}
						}
					}
				}
				if (i==2) {//第三次的硬币中有假币
					for (int j = 0; j < 2; j++) {
						char []chs = str3[j].toCharArray();
						for (int k = 0; k < chs.length; k++) {
							
							if(!set.contains(chs[k])){
								retValch = chs[k];
								tf = reqHT(laststr, i, j);

							}
						}
					}
				}
			}
		}
	
		if (set.size()<10) {
			throw new RuntimeException("无法获得结果");
		}
		return "假币是"+retValch+tf;
	}

	public static String reqHT(String[] laststr, int i, int j) {
		String tf;
		if(laststr[i].equalsIgnoreCase("up")){ //右边高
			if(j==1)//并且假币在右边
				tf = "假币轻";
			else {
				
				tf = "假币重";
			}
		}
		else { //右边低
			if (j==1) { //假币在右边
				
				tf = "假币重";
			}
			else {
				
				tf = "假币轻";
			}
		}
		return tf;
	}
	
	public static String[] inmethod() {
		String	readline = input(System.in);
		String []strs = null;
			if(readline !=null){
				//将输入的信息进行切割
				strs= splitReadLne(readline);
			}
			
			return strs;
	}
	public static String[] splitReadLne(String readline) {
			//设置一个变量记录空格出现的索引值
			int index = 0;
			//设置一个数组,因为长度不确定,将它设置为str的长度
			String []arr_str = new String[readline.length()];
			//arr_str的长度不确定,为了将不需要的null去掉,所以设置了arr_str2数组
			String []arr_str2 =null;
			//为了将数据存储到arr_str中,定义一个变量
			int p = 0;
			while(((index = readline.indexOf(" ")))!=-1){  //当索引值不是空的时候循环(字符串中有空格)
				if(index == 0){ 
					/*
					 * 如果得到的字串中第一个字符还是空格,就接着更新
						空20空空29空8 index = 0,就从1开始取后边的所有的数。
						得到20空空29空8 index = 3!=0.
						将20取出来放到一个数组里去,并且将去除20后的字符串更新
						
					 */
					readline = readline.substring(1, readline.length());
				}else{
					arr_str[p++] = readline.substring(0,index);
					readline = readline.substring(index+1, readline.length());
				}
					
			}
			//到这里肯定还有一个数,直接添加到数组中去
				arr_str[p] = readline;
			
			int mark = 0;  //得到了一个含有多个null的数组。
			for (int i = 0; i < arr_str.length; i++) {
				//将第一次出现null元素的位置记录,这个位置就是数组所需要的实际长度
				//跳出循环。得到最小长度
				if(arr_str[i] == null){
					mark = i;
					break;
				}
			}
			arr_str2 = new String[mark];  //长度确定了,就可以直接new对象了
			for(int i = 0;i<mark;i++){
				arr_str2[i] = arr_str[i];
			}
			
			//String arr_str[] = str.split(" ");
			return arr_str2;
	
	}
	/**
	 * 三次就可以得到结果
	 * 不知道假硬币比真硬币轻还是重
	 */
	
	public static String input (InputStream in){
		//为了方便,将键盘输入的字节使用转换流进行转换
		BufferedReader bufr = new BufferedReader(new InputStreamReader(in));
		String line = null;
		try {
			line = bufr.readLine();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		if (line !=null) {
			return line;
		}
		return null;
	}
}

 

 ------- android培训java培训、期待与您交流! ----------

——————————————————————————————————————————————— 

基于STM32F407,使用DFS算法实现最短迷宫路径检索,分为三种模式:1.DEBUG模式,2. 训练模式,3. 主程序模式 ,DEBUG模式主要分析bug,测量必要数据,训练模式用于DFS算法训练最短路径,并将最短路径以链表形式存储Flash, 主程序模式从Flash中….zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值