问题描述:

示例 1:

输入: "x+5-3+x=6+x-2"
输出: "x=2"
示例 2: 输入: "x=x"
输出: "Infinite solutions"
示例 3: 输入: "2x=x"
输出: "x=0"
示例 4: 输入: "2x+3x-6x=x+2"
输出: "x=-1"
示例 5: 输入: "x=x+2"
输出: "No solution"

  

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

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

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

解析字符串注意边界

public class Main {

    public static void main(String[] args) {
System.out.println(solveEquation("x+5-3+x=6+x-2"));
}
public static String solveEquation(String equation) {
//等号为界,分为两边
String[] split = equation.split("=");
int[] left = findPreNumSum(split[0]);
int[] right = findPreNumSum(split[1]);
if (left[0]==right[0]&&left[1]==right[1])
return "Infinite solutions";
else if (left[0]==right[0]&&left[1]!=right[1]){
return "No solution";
}else {
return "x="+(right[1]-left[1])/(left[0]-right[0]);
}
}
public static int[] findPreNumSum(String s){
int x_sum = 0;
int integerSum = 0;
int length = s.length();
for (int i = 0;i < length;i++){
char it = s.charAt(i);
char pre = i>0?s.charAt(i-1):'n';
char next = i>length-2?'n':s.charAt(i+1);
if(it=='+'||it=='-')
continue;
//此分支计算等号某一侧的x的系数和
if (it == 'x'||it=='X'){
if (pre=='n'){
//x位于第一位
x_sum = x_sum + 1;
}else {
int count = 1;
int sum = 0;
int j;
for (j = i-1;;){
//从当前遍历位(即x)的前一位往前推
if(j<0||s.charAt(j)=='+'||s.charAt(j)=='-'){
if (i-j==1&&(s.charAt(j)=='+'||s.charAt(j)=='-')){
//非第一位的x系数为1/-1的情况
x_sum = x_sum + (s.charAt(j)=='+'?1:(-1));
System.out.println(x_sum);
}
//x系数累乘的倍数归为1
count = 1;
break;
}
//算系数,不分加减
sum = sum + (s.charAt(j)-'0')*count;
count = count * 10;
j--; }
//根据前面的符号来计算已遍历的x的系数和
x_sum = x_sum + ((j==-1||s.charAt(j)=='+')?1:(-1))*sum;
count = 1;
sum = 0;
}
}
//此分支计算等号某一侧的常数和
else {
//若此时遍历不是邻近x的数字,跳过
if (('0'<=next&&next<='9')||next=='x')
continue;
int count = 1;
int sum = 0;
int j;
//从当前遍历位往前推,即算上本身
for (j = i;;){
if(j<0||s.charAt(j)=='+'||s.charAt(j)=='-'){
count = 1;
break;
}
//同上,计算系数,不分符号
sum = sum + (s.charAt(j)-'0')*count;
count = count * 10;
j--;
}
//带上符号算已遍历的常数的和
integerSum = integerSum + ((j==-1||s.charAt(j)=='+')?1:(-1))*sum;
count = 1;
sum = 0;
}
}
System.out.println(x_sum+"-"+integerSum);
//返回此侧的x的系数和和常数和
return new int[]{x_sum,integerSum};
} }

  

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

[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. php 制作验证码不显示的问题

    php制作验证码的代码,这里就不多说了,网上有很多的,这里说一些可能遇到的问题. 1. 首先是检查自己的php.ini文件,是否支持gd库. 2.保证代码没有出问题. 3.检查字体文件路径是否正确. ...

  2. 新加了一块硬盘,在bios中可以看的到,在系统的磁盘管理器中看不到新加硬盘

    今天新加了一块硬盘,进入bios中可以看到新加的硬盘,但是进入系统后在磁盘管理及磁盘驱动器中都看不到.并且在设备管理器下其他设备出现了ATA channel1,前面显示感叹号,如下图所示: 而且电脑变 ...

  3. win8快捷键大全分享,非常全

    Windows 8全新的Metro操作体验,对于没有平板只能用快捷键来提高效率了.全面的Windows 8快捷键,请下载微软官方的Windows 8快捷键表格,快捷键全记完整个人都斯巴达了..其实常用 ...

  4. 第28章:MongoDB-索引--过期索引(TTL)

    ①过期索引(TTL) TTL索引是让文档的某个日期时间满足条件的时候自动删除文档,这是一种特殊的索引,这种索引不是为了提高查询速度的,TTL索引类似于缓存,缓存时间到了就过期了,就要被删除了 ②范例: ...

  5. GIS矢量数据化简:一种改进的道格拉斯-普克算法以及C++实现

    GIS领域的同志都知道,传统的道格拉斯-普克算法都是递归实现.然而有时候递归的层次太深的话会出现栈溢出的情况.在此,介绍一种非递归的算法. 要将递归算法改为非递归算法,一般情况下分为两种场景.第一种是 ...

  6. Docker网络简介

    Docker允许通过外部访问容器或则容器互联的方式来提供网络服务. 外部访问容器 容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过-P或则-P参数来指定断开映射.当使用 -P 标记时, ...

  7. Android多点触控手势基础

    处理多点触控手势 多点触控就是同时把一根以上的手指放在屏幕上. 再继续往下以前需要补充一些名词: 触控手势:就是把一根或者几根手指放在屏幕上做各种动作,其中包括保留一根手指的前提下,拿起或者放下其余的 ...

  8. eclipse环境搭建(插件安装)

    转自:http://www.iteye.com/topic/982182 使用eclipse真的有年头了,相信java程序员没有不知道它的,最近在给团队中新来的应届生做指导,专门讲解了一下Eclips ...

  9. html5+javascript的管廊监控页面

    这周二做的,支持苹果手机,安卓手机,电脑,平板访问

  10. 引用数据类型(Scanner类、Random类)

    Scanner类 Scanner类是引用数据类型的一种,我们可以使用该类来完成用户键盘录入,获取到录入的数据. 引用数据类型的使用 与定义基本数据类型变量不同,引用数据类型的变量定义及赋值有一个相对固 ...