• 【字符串】求解方程 数学


    题目描述

    求解一个给定的方程,将x以字符串 "x=#value" 的形式返回。该方程仅包含 '+' , '-' 操作,变量 x 和其对应系数。

    1. 如果方程没有解,请返回 "No solution" 。
    2. 如果方程有无限解,则返回 “Infinite solutions” 。
    3. 题目保证,如果方程中只有一个解,则 'x' 的值是一个整数。

    示例 1:

    输入: equation = "x+5-3+x=6+x-2"
    输出: "x=2"

    解题思路

    • 首先需要对这个字符串进行解析,需要处理的情况包括:数字、减号(-)、加号(+)、等号(=)、字符x 这几种情况;
    • 准备2个变量:isAdd判断当前操作符是不是加法、isLeft判断现在处理的是左边的字符串还是右边的字符串;
    • 准备一个数组 int left[] = new int[2],left[0]记录具体数字操作,left[1]记录x对应的系数操作。
    • 最后计算最终结果,结果参考,
      if (left[0] == 0) {
              return "Infinite solutions";
          } else {
              return "No solution";
          }
      } else {
          return "x=" + (0 - (left[0] / left[1]));
      }

    代码实现 

    1. class Solution1 {
    2. public String solveEquation(String equation) {
    3. int[] left = new int[2];
    4. boolean isAdd = true;
    5. boolean isLeft = true;
    6. char[] chars = equation.toCharArray();
    7. int length = chars.length;
    8. for (int i = 0; i < length; ) {
    9. char c = chars[i];
    10. if (Character.isDigit(c)) {
    11. int v = 0;
    12. while (i < length && Character.isDigit(chars[i])) {
    13. v *= 10;
    14. v += (chars[i] - '0');
    15. ++i;
    16. }
    17. if (isLeft) {
    18. if (i < length && chars[i] == 'x') {
    19. left[1] += v * (isAdd ? 1 : -1);
    20. ++i;
    21. } else {
    22. left[0] += v * (isAdd ? 1 : -1);
    23. }
    24. } else {
    25. if (i < length && chars[i] == 'x') {
    26. left[1] -= v * (isAdd ? 1 : -1);
    27. ++i;
    28. } else {
    29. left[0] -= v * (isAdd ? 1 : -1);
    30. }
    31. }
    32. } else if (chars[i] == '+') {
    33. isAdd = true;
    34. ++i;
    35. } else if (chars[i] == '-') {
    36. isAdd = false;
    37. ++i;
    38. } else if (chars[i] == '=') {
    39. isLeft = false;
    40. isAdd = true;
    41. ++i;
    42. } else if (chars[i] == 'x') {
    43. if (isLeft) {
    44. left[1] += (isAdd ? 1 : -1);
    45. } else {
    46. left[1] -= (isAdd ? 1 : -1);
    47. }
    48. ++i;
    49. }
    50. }
    51. if (left[1] == 0) {
    52. if (left[0] == 0) {
    53. return "Infinite solutions";
    54. } else {
    55. return "No solution";
    56. }
    57. } else {
    58. return "x=" + (0 - (left[0] / left[1]));
    59. }
    60. }
    61. public static void main(String[] args) {
    62. Solution1 solution = new Solution1();
    63. System.out.println(solution.solveEquation("x+5-3+x=6+x-2"));
    64. }
    65. }

    接着对这个代码进行一次重构,降低代码复杂度,代码实现如下:

    1. class Solution {
    2. public String solveEquation(String equation) {
    3. int[] left = new int[2];
    4. boolean isAdd = true;
    5. boolean isLeft = true;
    6. char[] chars = equation.toCharArray();
    7. int length = chars.length;
    8. for (int i = 0; i < length; ) {
    9. if (Character.isDigit(chars[i])) {
    10. int v = 0;
    11. do {
    12. v *= 10;
    13. v += (chars[i] - '0');
    14. } while (++i < length && Character.isDigit(chars[i]));
    15. if (i < length && chars[i] == 'x') {
    16. left[1] += v * getOperator(isAdd ^ isLeft);
    17. ++i;
    18. } else {
    19. left[0] += v * getOperator(isAdd ^ isLeft);
    20. }
    21. } else if (chars[i] == '+') {
    22. isAdd = true;
    23. ++i;
    24. } else if (chars[i] == '-') {
    25. isAdd = false;
    26. ++i;
    27. } else if (chars[i] == '=') {
    28. isLeft = false;
    29. isAdd = true;
    30. ++i;
    31. } else if (chars[i] == 'x') {
    32. left[1] += getOperator(isAdd ^ isLeft);
    33. ++i;
    34. }
    35. }
    36. if (left[1] == 0) {
    37. if (left[0] == 0) {
    38. return "Infinite solutions";
    39. } else {
    40. return "No solution";
    41. }
    42. } else {
    43. return "x=" + (0 - (left[0] / left[1]));
    44. }
    45. }
    46. private int getOperator(boolean isAdd) {
    47. return isAdd ? 1 : -1;
    48. }
    49. public static void main(String[] args) {
    50. Solution solution = new Solution();
    51. System.out.println(solution.solveEquation("x+5-3+x=6+x-2"));
    52. }
    53. }

    总结

    这道题是一道字符串解析题目,然后按照数学方法解决,上述2种实现方式耗时接近,只是减少了代码量。看了看其他人的解决方法,思路基本一致,耗时这块没有看到其他的优化了。如果有更加好的解法方法欢迎回复。

  • 相关阅读:
    架构:C4 Model
    SpringCloud复习:(1)netflix包里的DiscoveryClient类
    Java实现 数组匹配,矩阵行排序
    Ubuntu系统升级
    【C++】类和对象(上)
    使用HTML制作一个端午赛龙舟小游戏
    Leetcode 503.下一个更大元素Ⅱ
    uni-app_消息推送_华为厂商_unipush离线消息推送
    mysql之MHA的高可用
    SOC设计:关于时钟门控的细节
  • 原文地址:https://blog.csdn.net/weiliuhong1/article/details/126276558