[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中大部分的容器只能储存相同数据类型 ...
随机推荐
- my.ini优化mysql数据库性能的十个参数(推荐)
(1).max_connections:允许的同时客户的数量.增加该值增加 mysqld 要求的文件描述符的数量.这个数字应该增加,否则,你将经常看到 too many connections 错误. ...
- mysql 在linux下的完整安装过程
1.下载RPM包 https://cdn.mysql.com//archives/mysql-5.7/mysql-5.7.20-1.el7.x86_64.rpm-bundle.tar 2.先使用命令删 ...
- boost-使用format和lexical_cast实现数字和字符串之间的转换
使用boost的format可以实现数字到string的格式化转换,boost的lexical_cast可以实现string到数值的转换,eg: #include "boost/format ...
- nginx 下载 大文件被截断
如果出现大文件被截断,且ngix的日志大量出现以下类似报错: 则说明是nginx没有fastcgi_temp的读写权限.其中fastcgi_temp是自己的文件夹名称,每个人的不同且路径也会不同,这个 ...
- VGA的行场时序
之前碰到接收VGA时有的电脑可以有的电脑会出现画面偏移. 先来了解下数字显示器时序(DMT) DMT视频时序有四种: (1)Positive H & Positive V Syncs 行同步为 ...
- MySQL RR模式下如何加锁
锁的算法有三种,如下: record lock.gap lock.next_key lock 在不同的隔离级别下,所使用的锁的算法如下: RC:仅有record 锁 RR:有record和next_k ...
- C#的math类的全部运算方法
Abs 返回指定数字的绝对值.Acos 返回余弦值为指定数字的角度.Asin 返回正弦值为指定数字的角度.Atan 返回正切值为指定数字的角度.Atan2 返回正切值为两个指定数字的商的角度.BigM ...
- 适配android和iOS上position:absolute和input问题
//适配android上absolute和input的问题var oHeight = $(document).height(); //屏幕当前的高度$(window).resize(function( ...
- 关于QT应用在XP系统上兼容运行的问题
修改兼容XP: 1. 项目属性->配置属性->平台工具集:Visual Studio 2013 - Windows XP (v120_xp) 2. C/C++ 属性-> 代码生成-& ...
- 基于MATLAB的Sobel边缘检测算法实现
图像边缘就是图像灰度值突变的地方,也就是图像在该部分的像素值变化速度非常之快,就比如在坐标轴上一条曲线有刚开始的平滑突然来个大转弯,在变化出的导数非常大. Sobel算子主要用作边缘检测,它是一离散型 ...