【华为OJ】【算法总篇章】


【华为OJ】【107-24点运算】

【工程下载】


题目描述

计算24点是一种扑克牌益智游戏,随机抽出4张扑克牌,通过加(+),减(-),乘(*), 除(/)四种运算法则计算得到整数24,
本问题中,扑克牌通过如下字符或者字符串表示,其中,小写joker表示小王,大写JOKER表示大王:3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER
本程序要求实现:输入4张牌,输出一个算式,算式的结果为24点。
详细说明:
1.运算只考虑加减乘除运算,没有阶乘等特殊运算符号,友情提醒,整数除法要当心;
2.牌面2~10对应的权值为2~10, J、Q、K、A权值分别为为11、12、13、1;
3.输入4张牌为字符串形式,以一个空格隔开,首尾无空格;如果输入的4张牌中包含大小王,则输出字符串“ERROR”,表示无法运算;
4.输出的算式格式为4张牌通过+-*/四个运算符相连,中间无空格,4张牌出现顺序任意,只要结果正确;
5.输出算式的运算顺序从左至右,不包含括号,如1+2+3*4的结果为24
6.如果存在多种算式都能计算得出24,只需输出一种即可,如果无法得出24,则输出“NONE”表示无解。

输入描述

输入4张牌为字符串形式,以一个空格隔开,首尾无空格;

输出描述

如果输入的4张牌中包含大小王,则输出字符串“ERROR”,表示无法运算;

输入例子

A A A A

输出例子

NONE

算法实现

import java.util.Scanner;/*** Author: 王俊超* Date: 2016-05-06 07:35* CSDN: http://blog.csdn.net/derrantcm* Github: https://github.com/Wang-Jun-Chao* Declaration: All Rights Reserved !!!*/
public class Main {public static void main(String[] args) {
//        Scanner scanner = new Scanner(System.in);Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data2.txt"));while (scanner.hasNextLine()) {String input = scanner.nextLine();System.out.println(solve(input));}scanner.close();}/*** 进行24点运算,假设输入的牌都是合法的** @param input 输入的牌* @return 结果*/private static String solve(String input) {// 有王if (input.contains("joker") || input.contains("JOKER")) {return "ERROR";}String[] parts = input.split("(\\s)+");// 不是四个牌if (parts.length != 4) {return "ERROR";}// 将牌转换成数字int[] ints = new int[parts.length];for (int i = 0; i < ints.length; i++) {ints[i] = convert(parts[i]);}String[] r = {""};boolean result = point24(ints, r);// 有结果if (result) {return r[0];}return "ERROR";}/*** 4个[1, 13]的能否通过加减乘除,得到数字为24** @param opd 四个元素的数组* @param r   用于保存结果* @return true,可以组成24,false不可以组成24*/private static boolean point24(int[] opd, String[] r) {char[] opt = new char[opd.length - 1];char[] all = {'+', '-', '*', '/'};return point24(opd, opt, all, 0, r);}/*** @param opd 操作数* @param opt 用于计算的操作符* @param all 可以使用的全部操作符* @param n   当前处理的数* @param r   用于保存表达式结果* @return true,计算的值为24,false,计算的值不是24*/private static boolean point24(int[] opd, char[] opt, char[] all, int n, String[] r) {// 处理最后一个数字if (n == opd.length - 1) {if (calculate(opd, opt, r)) {return true;}} else {for (int i = n; i < opd.length; i++) {int temp = opd[n];opd[n] = opd[i];opd[i] = temp;for (char a : all) {opt[n] = a;boolean find = point24(opd, opt, all, n + 1, r);if (find) {return true;}}//  现场还原temp = opd[n];opd[n] = opd[i];opd[i] = temp;}}return false;}/*** 计算值** @param opd 操作数* @param opt 操作符* @param r   保存结果表达式* @return true,结果为24,false结果不是24*/private static boolean calculate(int[] opd, char[] opt, String[] r) {double v = opd[0];for (int i = 0; i < opt.length; i++) {v = calculate(v, opd[i + 1], opt[i]);}boolean eq = Math.abs(v - 24) < 0.0000001;if (eq) {r[0] = convert(opd[0]);for (int i = 0; i < opt.length; i++) {r[0] = r[0] + opt[i] + convert(opd[i + 1]);}}return eq;}/*** 将牌转换成对应的数值** @param s 牌* @return 数值*/private static int convert(String s) {if (s.length() == 1) {char c = s.charAt(0);if (c >= '2' && c <= '9') {return c - '0';}switch (c) {case 'J':return 11;case 'Q':return 12;case 'K':return 13;case 'A':return 1;default:// do nothing}} else {switch (s) {case "10":return 10;default:// do nothing}}throw new RuntimeException("参数错误:" + s + ",只能输入[2, 10]、J、Q、K、A");}/*** 将数值转换成牌** @param i 数值* @return 牌*/private static String convert(int i) {if (i >= 2 && i <= 10) {return "" + i;}switch (i) {case 1:return "A";case 11:return "J";case 12:return "Q";case 13:return "K";default:// do nothing}throw new RuntimeException("参数错误:" + i + ",牌值[1, 13]的整数");}/*** 表达式求值** @param a   操作数一* @param b   操作数二* @param opt 操作符* @return 运算结果*/private static double calculate(double a, double b, int opt) {switch (opt) {case '+':return a + b;case '-':return a - b;case '*':return a * b;case '/':return a / b;default:// do nothing}throw new RuntimeException("参数错误:" + ((char) opt) + "计算操作只支持加(+)、减(-)、*(乘)、除(、)");}}

【华为OJ】【107-24点运算】相关推荐

  1. C语言无符号双字节乘法,华为OJ机试标题:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)...

    华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘) 题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出 ...

  2. 【华为OJ】【097-24点游戏算法】

    [华为OJ][算法总篇章] [华为OJ][097-24点游戏算法] [工程下载] 题目描述 给出4个1-10的数字,通过加减乘除,得到数字为24就算胜利 输入: 4个1-10的数字.[数字允许重复,测 ...

  3. 循环相乘取整法C语言,华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)...

    题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出乘积,如:151851741 样例输入: 1234567 123 样例输出: 1518 ...

  4. 【华为OJ】【042-矩阵乘法】

    [华为OJ][算法总篇章] [华为OJ][042-矩阵乘法] [工程下载] 题目描述 如果A是个x行y列的矩阵,B是个y行z列的矩阵,把A和B相乘,其结果将是另一个x行z列的矩阵C. 这个矩阵的每个元 ...

  5. 【华为OJ】【067-求最小公倍数】

    [华为OJ][算法总篇章] [华为OJ][067-求最小公倍数] [工程下载] 题目描述 正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数. ...

  6. 华为OJ(MP3光标移动)

    描述: MP3 Player因为屏幕较小,显示歌曲列表的时候每屏只能显示几首歌曲,用户要通过上下键才能浏览所有的歌曲.为了简化处理,假设每屏只能显示4首歌曲,光标初始的位置为第1首歌. 现在要实现通过 ...

  7. 【华为OJ】【099-MP3光标位置】

    [华为OJ][算法总篇章] [华为OJ][099-MP3光标位置] [工程下载] 题目描述 MP3 Player因为屏幕较小,显示歌曲列表的时候每屏只能显示几首歌曲,用户要通过上下键才能浏览所有的歌曲 ...

  8. 【华为OJ】【063-字符串分割】

    [华为OJ][算法总篇章] [华为OJ][063-字符串分割] [工程下载] 题目描述 连续输入字符串(输出次数为N,字符串长度小于100),请按长度为8拆分每个字符串后输出到新的字符串数组, 长度不 ...

  9. java oj题及答案_华为OJ答案(java版)题目2

    华为OJ&答案(java版) 1. 功能:等差数列 2,5,8,11,14.... 输入:正整数N >0 输出:求等差数列前N项和 返回:转换成功返回 0 ,非法输入与异常返回-1 pu ...

最新文章

  1. CentOS 8 即将停更,未来我们该何去何从?
  2. 在统一软件开发过程中使用UML
  3. marquee文字起始位置_PS修图改字无痕扫描件复印件截图文字英文日期修改:制作漂亮红色丝绸文字图片的PS教程...
  4. React 性能优化之批量处理 unstable_batchedUpdates
  5. RHEL4- ssh服务(二)ssh服务器的配置和启动
  6. “化鲲为鹏,我有话说”如何用鲲鹏弹性云服务器部署《Hadoop伪分布式》
  7. MQTT通信协议的简介、特点及实现原理 - 第1章
  8. ajax的两个重要参数contentType 和dataType
  9. 驰骋工作流程引擎多人待办处理模式的升级
  10. Python进阶-----类的内置item属性方法
  11. Web.config常用节点解析:
  12. ryujinx模拟器linux安装教学,switch模拟器Ryujinx
  13. 手机开机后android,手机开机后出现Android字样然后就自动关机了
  14. 可查看抖音各项数据的软件有哪些?99%的人可能不知道这3款
  15. 与你的梦,种植于青山绿水间
  16. 面试题:看数字找规律
  17. USB1.0 2.0区别
  18. 什么是Token(令牌)
  19. FreeRTOS学习(一)
  20. WOW.js插件使用

热门文章

  1. python http2_python中 urllib, urllib2, httplib, httplib2 几个库的区别
  2. 鼠标连点器同时点多个位置_一台电脑登录多个微信,简单,按住ENTER,鼠标快速点,扫描OK...
  3. 浅谈搜索引擎——SEO
  4. Ubuntu 安装nginx
  5. 3D环球地图-英文版本HTML
  6. 详解ISO 13400文档(DoIP协议)-1
  7. 转 基于H.264的远程视频监控
  8. 关于目标检测中bounding box编码和解码时weight参数的理解
  9. outlook突然变得很慢很卡
  10. 构建文件系统脚本分析笔记