[LeetCode]640解方程式
问题描述:
示例 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解方程式的更多相关文章
- 由Leetcode详解算法 之 动态规划(DP)
因为最近一段时间接触了一些Leetcode上的题目,发现许多题目的解题思路相似,从中其实可以了解某类算法的一些应用场景. 这个随笔系列就是我尝试的分析总结,希望也能给大家一些启发. 动态规划的基本概念 ...
- Java实现 LeetCode 640 求解方程(计算器的加减法计算)
640. 求解方程 求解一个给定的方程,将x以字符串"x=#value"的形式返回.该方程仅包含'+',' - '操作,变量 x 和其对应系数. 如果方程没有解,请返回" ...
- Java实现 LeetCode 37 解数独
37. 解数独 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实 ...
- leetcode 36 有效的数独 哈希表 unordered_set unordersd_map 保存状态 leetcode 37 解数独
leetcode 36 感觉就是遍历. 保存好状态,就是各行各列还有各分区divide的情况 用数组做. 空间小时间大 class Solution { public: bool isValidSud ...
- Leetcode 详解(ReverseWords)
Leetcode里面关于字符串的一些问题,描述如下: Given an input string, reverse the string word by word. For example,Given ...
- 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 ...
- Leetcode 640.求解方程
求解方程 求解一个给定的方程,将x以字符串"x=#value"的形式返回.该方程仅包含'+',' - '操作,变量 x 和其对应系数. 如果方程没有解,请返回"No so ...
- FZU 2125 简单的等式 【数学/枚举解方程式】
现在有一个等式如下:x^2+s(x,m)x-n=0.其中s(x,m)表示把x写成m进制时,每个位数相加的和.现在,在给定n,m的情况下,求出满足等式的最小的正整数x.如果不存在,请输出-1. Inpu ...
- 【LeetCode】解数独
做题之前先复习下[STL中的Tuple容器] 我们知道,在Python中,大家都知道tuple这个概念,是一个只读的元素容器,容器内的元素数据类型可以不同,而在CPP中大部分的容器只能储存相同数据类型 ...
随机推荐
- 4. Father's Impact on a Child's Language Development 父亲对孩子语言发展的影响
4. Father's Impact on a Child's Language Development 父亲对孩子语言发展的影响 (1)Im families with two working pa ...
- 修改oracle用户密码为永不过期
错误提示:ORA-28001: the password has expired (DBD ERROR: OCISessionBegin) 解决方法:修改密码为永不过期 (1)查看用户的proifle ...
- excel2007自定义菜单项学习
参考: http://club.excelhome.net/thread-1288002-1-1.html http://club.excelhome.net/thread-709306-1-1.ht ...
- es6 字符串方法
1.字符串的新方法 includes() 包含属性 startsWith() 头部开始是否包含 endWith() 字符串是否在尾部 ========三个返回值都为布尔值 第二参数为数字 e ...
- 移动端meta设置
网页作者: <meta name="author" content="name, email@gmail.com"/>声明文档使用的字符编码: &l ...
- Java 判断字符串能否转化为数字的三种方法
用JAVA自带的函数 public static boolean isNumeric(String str){ for (int i = str.length();--i>=0;){ if (! ...
- std::set 中内部元素有序条件删除的理解
std::set 中内部元素有序条件删除的理解 1. std::set中的元素是有序排列的 注意:Set集合中的元素通过iterator的引用,但是不能修改. 元素排序: (1)元素中实现比较oper ...
- [NewCoder 7] 用两个栈实现队列
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 水题,直接上代码: class Solution { public: void push(int nod ...
- python- 动态加载目录下所有的类
# 背景 自动化测试框架中model层下有很多类,用来操作mysql的,使用的时候需要把全部的类加载进来,需要使用到动态加载类 # 解决方法 使用pkgutil,内置的方法,常用的话有两个方法 ite ...
- HTML给table添加单线边框
一般来说,给表格加边框都会出现不同的问题,以下是给表格加边框后展现比较好的方式 <style> table,table tr th, table tr td { border:1px so ...