当前位置:   article > 正文

华为OD机试题-最长合法表达式(java解法)_提取字符串中的最长合法简单数学表达式

提取字符串中的最长合法简单数学表达式

  一、题目


提取字符串中的最长合法简单数学表达式,字符串长度最长的,并计算表达式的值,如果没有返回0。简单数学表达式只能包含以下内容0-9 数字,符号+-*/

说明:
1.所有数字,计算结果都不超过 long
2.如果有多个长度一样的,请返回第一个表达式的结果
3.数学表达式,必须是最长的,合法的
4.操作符不能连续出现,如 +--+1 是不合法的


输入
字符串


输出
表达式值

示例一

输入

1-2abcd

输出

-1

示例二

输入

1-2abs1-2*3+7dd4-5+6

输出

2

 示例三

输入

a1/0+8d

输出

8

二、解法

这道题有点难度,有以下几个难点:

1、如何找出最长合法表达式?

2、如何计算该表达式?

3、四则运算有一种特殊情况,除数不为零,这种也必须考虑。

上述三个问题的对应解法:

1、用正则表达式筛选表达式。

2、用递归方法计算,主要优势代码简洁。下面链接有详细说明。四则运算字符串计算数值-Java解法icon-default.png?t=N7T8https://blog.csdn.net/weixin_43389472/article/details/135962943

3、将 “/0” 替换为“a0”,这样既不影响前面表达式也不影响后面,注意这个“0”是不能去掉的,会造成后面表达式的不合法,如上述 示例三 一样。

解法如下:

  1. import java.util.Scanner;
  2. import java.util.regex.Matcher;
  3. import java.util.regex.Pattern;
  4. public class Main {
  5. public static void main(String[] args) {
  6. Scanner scanner = new Scanner(System.in);
  7. String str = scanner.nextLine();
  8. String longStr = dealWith(str);
  9. if (!longStr.isEmpty()) {
  10. int result = calculate(longStr);
  11. System.out.println(result);
  12. } else {
  13. System.out.println(0);
  14. }
  15. }
  16. //判断字符串是否只有数字
  17. private static boolean isNumber(String str) {
  18. for (int i = 0; i < str.length(); i++) {
  19. if (!Character.isDigit(str.charAt(i))) {
  20. return false;
  21. }
  22. }
  23. return true;
  24. }
  25. //利用递归方法计算四则运算
  26. private static int calculate(String str) {
  27. if (isNumber(str)) {
  28. return Integer.parseInt(str);
  29. }
  30. if (str.contains("+")) {
  31. int index = str.indexOf("+");
  32. return calculate(str.substring(0, index)) + calculate(str.substring(index + 1));
  33. }
  34. if (str.contains("-")) {
  35. int index = str.indexOf("-");
  36. return calculate(str.substring(0, index)) - calculate(str.substring(index + 1));
  37. }
  38. if (str.contains("*")) {
  39. int index = str.indexOf("*");
  40. return calculate(str.substring(0, index)) * calculate(str.substring(index + 1));
  41. }
  42. if (str.contains("/")) {
  43. int index = str.indexOf("/");
  44. return calculate(str.substring(0, index)) / calculate(str.substring(index + 1));
  45. }
  46. return 0;
  47. }
  48. //借助正则表达式拆出符合要求的表达式
  49. private static String dealWith(String str) {
  50. //将除数等于0替换掉,注意string是不可变量,所以要用新的变量代替
  51. String replaceStr = str.replace("/0", "a0");
  52. int max = 0;
  53. String longStr = "";
  54. String regex = "\\d+([\\+\\-*/]\\d+)+";
  55. Pattern compile = Pattern.compile(regex);
  56. Matcher matcher = compile.matcher(replaceStr);
  57. while (matcher.find()) {
  58. String group = matcher.group();
  59. if (group.length() > max) {
  60. max = group.length();
  61. longStr = group;
  62. }
  63. }
  64. return longStr;
  65. }
  66. }

欢迎大家留言讨论。

注:题目源自 梦想橡皮擦

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号