问题描述:

  1. 示例 1
  2.  
  3. 输入: "x+5-3+x=6+x-2"
  4. 输出: "x=2"
  5. 示例 2:
  6.  
  7. 输入: "x=x"
  8. 输出: "Infinite solutions"
  9. 示例 3:
  10.  
  11. 输入: "2x=x"
  12. 输出: "x=0"
  13. 示例 4:
  14.  
  15. 输入: "2x+3x-6x=x+2"
  16. 输出: "x=-1"
  17. 示例 5:
  18.  
  19. 输入: "x=x+2"
  20. 输出: "No solution"

  

思路:考的是字符串的解析

跟平时学的解方程的一样,根据等号将方程分为两个部分

将两端的方程的X的系数和,和常数和计算出来,然后两边的X的系数和相减,常数和相减,相除,分清楚情况就行

解析字符串注意边界

  1. public class Main {
  2.  
  3. public static void main(String[] args) {
  4. System.out.println(solveEquation("x+5-3+x=6+x-2"));
  5. }
  6. public static String solveEquation(String equation) {
  7. //等号为界,分为两边
  8. String[] split = equation.split("=");
  9. int[] left = findPreNumSum(split[0]);
  10. int[] right = findPreNumSum(split[1]);
  11. if (left[0]==right[0]&&left[1]==right[1])
  12. return "Infinite solutions";
  13. else if (left[0]==right[0]&&left[1]!=right[1]){
  14. return "No solution";
  15. }else {
  16. return "x="+(right[1]-left[1])/(left[0]-right[0]);
  17. }
  18. }
  19. public static int[] findPreNumSum(String s){
  20. int x_sum = 0;
  21. int integerSum = 0;
  22. int length = s.length();
  23. for (int i = 0;i < length;i++){
  24. char it = s.charAt(i);
  25. char pre = i>0?s.charAt(i-1):'n';
  26. char next = i>length-2?'n':s.charAt(i+1);
  27. if(it=='+'||it=='-')
  28. continue;
  29. //此分支计算等号某一侧的x的系数和
  30. if (it == 'x'||it=='X'){
  31. if (pre=='n'){
  32. //x位于第一位
  33. x_sum = x_sum + 1;
  34. }else {
  35. int count = 1;
  36. int sum = 0;
  37. int j;
  38. for (j = i-1;;){
  39. //从当前遍历位(即x)的前一位往前推
  40. if(j<0||s.charAt(j)=='+'||s.charAt(j)=='-'){
  41. if (i-j==1&&(s.charAt(j)=='+'||s.charAt(j)=='-')){
  42. //非第一位的x系数为1/-1的情况
  43. x_sum = x_sum + (s.charAt(j)=='+'?1:(-1));
  44. System.out.println(x_sum);
  45. }
  46. //x系数累乘的倍数归为1
  47. count = 1;
  48. break;
  49. }
  50. //算系数,不分加减
  51. sum = sum + (s.charAt(j)-'0')*count;
  52. count = count * 10;
  53. j--;
  54.  
  55. }
  56. //根据前面的符号来计算已遍历的x的系数和
  57. x_sum = x_sum + ((j==-1||s.charAt(j)=='+')?1:(-1))*sum;
  58. count = 1;
  59. sum = 0;
  60. }
  61. }
  62. //此分支计算等号某一侧的常数和
  63. else {
  64. //若此时遍历不是邻近x的数字,跳过
  65. if (('0'<=next&&next<='9')||next=='x')
  66. continue;
  67. int count = 1;
  68. int sum = 0;
  69. int j;
  70. //从当前遍历位往前推,即算上本身
  71. for (j = i;;){
  72. if(j<0||s.charAt(j)=='+'||s.charAt(j)=='-'){
  73. count = 1;
  74. break;
  75. }
  76. //同上,计算系数,不分符号
  77. sum = sum + (s.charAt(j)-'0')*count;
  78. count = count * 10;
  79. j--;
  80. }
  81. //带上符号算已遍历的常数的和
  82. integerSum = integerSum + ((j==-1||s.charAt(j)=='+')?1:(-1))*sum;
  83. count = 1;
  84. sum = 0;
  85. }
  86. }
  87. System.out.println(x_sum+"-"+integerSum);
  88. //返回此侧的x的系数和和常数和
  89. return new int[]{x_sum,integerSum};
  90. }
  91.  
  92. }

  

太菜了,各位有更牛逼的解决办法告诉一下我呀

[LeetCode]640解方程式的更多相关文章

  1. 由Leetcode详解算法 之 动态规划(DP)

    因为最近一段时间接触了一些Leetcode上的题目,发现许多题目的解题思路相似,从中其实可以了解某类算法的一些应用场景. 这个随笔系列就是我尝试的分析总结,希望也能给大家一些启发. 动态规划的基本概念 ...

  2. Java实现 LeetCode 640 求解方程(计算器的加减法计算)

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

  3. Java实现 LeetCode 37 解数独

    37. 解数独 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实 ...

  4. leetcode 36 有效的数独 哈希表 unordered_set unordersd_map 保存状态 leetcode 37 解数独

    leetcode 36 感觉就是遍历. 保存好状态,就是各行各列还有各分区divide的情况 用数组做. 空间小时间大 class Solution { public: bool isValidSud ...

  5. Leetcode 详解(ReverseWords)

    Leetcode里面关于字符串的一些问题,描述如下: Given an input string, reverse the string word by word. For example,Given ...

  6. LeetCode 全解(bug free 训练)

    1.Two Sum Given an array of integers, return indices of the two numbers such that they add up to a s ...

  7. Leetcode 640.求解方程

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

  8. FZU 2125 简单的等式 【数学/枚举解方程式】

    现在有一个等式如下:x^2+s(x,m)x-n=0.其中s(x,m)表示把x写成m进制时,每个位数相加的和.现在,在给定n,m的情况下,求出满足等式的最小的正整数x.如果不存在,请输出-1. Inpu ...

  9. 【LeetCode】解数独

    做题之前先复习下[STL中的Tuple容器] 我们知道,在Python中,大家都知道tuple这个概念,是一个只读的元素容器,容器内的元素数据类型可以不同,而在CPP中大部分的容器只能储存相同数据类型 ...

随机推荐

  1. my.ini优化mysql数据库性能的十个参数(推荐)

    (1).max_connections:允许的同时客户的数量.增加该值增加 mysqld 要求的文件描述符的数量.这个数字应该增加,否则,你将经常看到 too many connections 错误. ...

  2. mysql 在linux下的完整安装过程

    1.下载RPM包 https://cdn.mysql.com//archives/mysql-5.7/mysql-5.7.20-1.el7.x86_64.rpm-bundle.tar 2.先使用命令删 ...

  3. boost-使用format和lexical_cast实现数字和字符串之间的转换

    使用boost的format可以实现数字到string的格式化转换,boost的lexical_cast可以实现string到数值的转换,eg: #include "boost/format ...

  4. nginx 下载 大文件被截断

    如果出现大文件被截断,且ngix的日志大量出现以下类似报错: 则说明是nginx没有fastcgi_temp的读写权限.其中fastcgi_temp是自己的文件夹名称,每个人的不同且路径也会不同,这个 ...

  5. VGA的行场时序

    之前碰到接收VGA时有的电脑可以有的电脑会出现画面偏移. 先来了解下数字显示器时序(DMT) DMT视频时序有四种: (1)Positive H & Positive V Syncs 行同步为 ...

  6. MySQL RR模式下如何加锁

    锁的算法有三种,如下: record lock.gap lock.next_key lock 在不同的隔离级别下,所使用的锁的算法如下: RC:仅有record 锁 RR:有record和next_k ...

  7. C#的math类的全部运算方法

    Abs 返回指定数字的绝对值.Acos 返回余弦值为指定数字的角度.Asin 返回正弦值为指定数字的角度.Atan 返回正切值为指定数字的角度.Atan2 返回正切值为两个指定数字的商的角度.BigM ...

  8. 适配android和iOS上position:absolute和input问题

    //适配android上absolute和input的问题var oHeight = $(document).height(); //屏幕当前的高度$(window).resize(function( ...

  9. 关于QT应用在XP系统上兼容运行的问题

    修改兼容XP: 1. 项目属性->配置属性->平台工具集:Visual Studio 2013 - Windows XP (v120_xp) 2. C/C++ 属性-> 代码生成-& ...

  10. 基于MATLAB的Sobel边缘检测算法实现

    图像边缘就是图像灰度值突变的地方,也就是图像在该部分的像素值变化速度非常之快,就比如在坐标轴上一条曲线有刚开始的平滑突然来个大转弯,在变化出的导数非常大. Sobel算子主要用作边缘检测,它是一离散型 ...