640.求解方程 其他实现
This commit is contained in:
parent
f1d65b92f1
commit
bebc20c212
|
@ -5,7 +5,7 @@
|
|||
* @return {number}
|
||||
* @see https://leetcode-cn.com/problems/xor-operation-in-an-array/
|
||||
*/
|
||||
var xorOperation = function (n, start) {
|
||||
const xorOperation = function (n, start) {
|
||||
return (start & 3) < 2 ? ((n & 1) === 0) ? (n & 3) : (start + 2 * n - 3 + (n & 3)) : ((n & 1) === 0) ? ((start + (n - 1) * 2) ^ (start - 2 + (n & 3))) : (start + 1 - (n & 3));
|
||||
};
|
||||
|
||||
|
@ -15,7 +15,7 @@ var xorOperation = function (n, start) {
|
|||
* @return {number}
|
||||
* @see https://leetcode-cn.com/problems/sqrtx/
|
||||
*/
|
||||
var mySqrt = function (x) {
|
||||
const mySqrt = function (x) {
|
||||
const xHalf = 0.5 * x;
|
||||
let i = new BigInt64Array(new Float64Array([x]).buffer)[0];
|
||||
i = 0x1FF7A3BEA91D9B1Bn + (i >> 1n);
|
||||
|
@ -30,6 +30,6 @@ var mySqrt = function (x) {
|
|||
* @param {number[]} nums
|
||||
* @return {number}
|
||||
*/
|
||||
var missingNumber = function(nums) {
|
||||
const missingNumber = function (nums) {
|
||||
return [nums.length, 1, nums.length + 1, 0][nums.length & 3] ^ nums.reduce((o, n) => o ^ n, 0);
|
||||
};
|
||||
|
|
|
@ -0,0 +1,42 @@
|
|||
/**
|
||||
* 640.求解方程
|
||||
* @param {string} equation 方程式
|
||||
* @return {string} 解
|
||||
* @see <a href="https://leetcode-cn.com/problems/solve-the-equation/">原题链接</a>
|
||||
*/
|
||||
const solveEquation = function (equation) {
|
||||
let a = 0, b = 0, c = 0, sign = 1, left = 1, hasC = false;
|
||||
for (let z of equation) {
|
||||
switch (z) {
|
||||
case 'x':
|
||||
a += hasC ? sign * left * c : sign * left, c = 0, hasC = false;
|
||||
break;
|
||||
case '+':
|
||||
b += sign * left * c, c = 0, sign = 1, hasC = false;
|
||||
break;
|
||||
case '-':
|
||||
b += sign * left * c, c = 0, sign = -1, hasC = false;
|
||||
break;
|
||||
case '=':
|
||||
b += sign * left * c, c = 0, sign = 1, left = -1, hasC = false;
|
||||
break;
|
||||
default:
|
||||
c = c * 10 + (z - '0'), hasC = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
b += sign * left * c;
|
||||
if (a === 0 && b === 0) {
|
||||
return "Infinite solutions";
|
||||
} else if (a === 0) {
|
||||
return "No solution";
|
||||
} else {
|
||||
return "x=" + -b / a;
|
||||
}
|
||||
};
|
||||
|
||||
console.assert(solveEquation("x+5-3+x=6+x-2") === "x=2");
|
||||
console.assert(solveEquation("x=x") === "Infinite solutions");
|
||||
console.assert(solveEquation("2x=x") === "x=0");
|
||||
console.assert(solveEquation("0x=0") === "Infinite solutions");
|
||||
console.assert(solveEquation("0=0x") === "Infinite solutions");
|
|
@ -0,0 +1,36 @@
|
|||
function solveEquation(equation: string): string {
|
||||
let [a, b, c, sign, left, hasC] = [0, 0, 0, 1, 1, false];
|
||||
for (let z of equation) {
|
||||
switch (z) {
|
||||
case 'x':
|
||||
[a, c, hasC] = [a + (hasC ? sign * left * c : sign * left), 0, false];
|
||||
break;
|
||||
case '+':
|
||||
[b, c, sign, hasC] = [b + sign * left * c, 0, 1, false];
|
||||
break;
|
||||
case '-':
|
||||
[b, c, sign, hasC] = [b + sign * left * c, 0, -1, false];
|
||||
break;
|
||||
case '=':
|
||||
[b, c, sign, left, hasC] = [b + sign * left * c, 0, 1, -1, false];
|
||||
break;
|
||||
default:
|
||||
[c, hasC] = [c * 10 + Number(z), true];
|
||||
break;
|
||||
}
|
||||
}
|
||||
b += sign * left * c;
|
||||
if (a === 0 && b === 0) {
|
||||
return "Infinite solutions";
|
||||
} else if (a === 0) {
|
||||
return "No solution";
|
||||
} else {
|
||||
return "x=" + -b / a;
|
||||
}
|
||||
}
|
||||
|
||||
console.assert(solveEquation("x+5-3+x=6+x-2") === "x=2");
|
||||
console.assert(solveEquation("x=x") === "Infinite solutions");
|
||||
console.assert(solveEquation("2x=x") === "x=0");
|
||||
console.assert(solveEquation("0x=0") === "Infinite solutions");
|
||||
console.assert(solveEquation("0=0x") === "Infinite solutions");
|
|
@ -1,2 +1,7 @@
|
|||
// See https://aka.ms/new-console-template for more information
|
||||
|
||||
using my_leetcode;
|
||||
|
||||
Console.WriteLine("Hello, World!");
|
||||
var s = new Solution();
|
||||
Console.WriteLine(s.SolveEquation("x+5-3+x=6+x-2"));//x=2
|
||||
|
|
|
@ -34,5 +34,34 @@ namespace my_leetcode
|
|||
f = f * 0.5 + xHalf / f;
|
||||
return (int)f;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 640. 求解方程
|
||||
/// </summary>
|
||||
/// <param name="equation">方程式</param>
|
||||
/// <returns>解</returns>
|
||||
public string SolveEquation(string equation)
|
||||
{
|
||||
var (a, b, c, sign, left, hasC) = (0, 0, 0, 1, 1, false);
|
||||
foreach (var z in equation)
|
||||
{
|
||||
(a, b, c, sign, left, hasC) = z switch
|
||||
{
|
||||
'x' => (a + (hasC ? sign * left * c : sign * left), b, 0, sign, left, false),
|
||||
'+' => (a, b + sign * left * c, 0, 1, left, false),
|
||||
'-' => (a, b + sign * left * c, 0, -1, left, false),
|
||||
'=' => (a, b + sign * left * c, 0, 1, -1, false),
|
||||
_ => (a, b, c * 10 + z - '0', sign, left, true)
|
||||
};
|
||||
}
|
||||
|
||||
b += sign * left * c;
|
||||
return a switch
|
||||
{
|
||||
0 when b == 0 => "Infinite solutions",
|
||||
0 => "No solution",
|
||||
_ => "x=" + -b / a
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include <functional>
|
||||
#include <semaphore.h>
|
||||
#include <queue>
|
||||
#include <stack>
|
||||
#include "structure.h"
|
||||
|
||||
using namespace std;
|
||||
|
@ -131,6 +132,54 @@ public:
|
|||
static bool check(TreeNode *l, TreeNode *r) {
|
||||
return (!l && !r) || (l && r) && (l->val == r->val) && check(l->left, r->right) && check(l->right, r->left);
|
||||
}
|
||||
|
||||
bool isValid(const string& s) {
|
||||
if (s.size() & 1) return false;
|
||||
std::stack<char> stack;
|
||||
for (char c: s)
|
||||
if (c == '(' || c == '[' || c == '{') stack.push(c + (1 << (c & 1)));
|
||||
else if (stack.empty() || stack.top() != c) return false;
|
||||
else stack.pop();
|
||||
return stack.empty();
|
||||
}
|
||||
|
||||
/**
|
||||
* 640. 求解方程
|
||||
* @param equation 方程式
|
||||
* @return 解
|
||||
* @see <a href="https://leetcode-cn.com/problems/solve-the-equation/">原题链接</a>
|
||||
*/
|
||||
string solveEquation(const string& equation) {
|
||||
int a = 0, b = 0, c = 0, sign = 1, left = 1;
|
||||
bool hasC = false;
|
||||
for(char z : equation) {
|
||||
switch (z) {
|
||||
case 'x':
|
||||
a += hasC ? sign * left * c : sign * left, c = 0, hasC = false;
|
||||
break;
|
||||
case '+':
|
||||
b += sign * left * c, c = 0, sign = 1, hasC = false;
|
||||
break;
|
||||
case '-':
|
||||
b += sign * left * c, c = 0, sign = -1, hasC = false;
|
||||
break;
|
||||
case '=':
|
||||
b += sign * left * c, c = 0, sign = 1, left = -1, hasC = false;
|
||||
break;
|
||||
default:
|
||||
c = c * 10 + z - '0', hasC = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
b += sign * left * c;
|
||||
if (a == 0 && b == 0) {
|
||||
return "Infinite solutions";
|
||||
} else if (a == 0) {
|
||||
return "No solution";
|
||||
} else {
|
||||
return "x=" + std::to_string(-b / a);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -84,4 +84,55 @@ public class Solution {
|
|||
isSymmetric(new TreeNode(0, root.left.left, root.right.right)) &&
|
||||
isSymmetric(new TreeNode(0, root.left.right, root.right.left));
|
||||
}
|
||||
|
||||
/**
|
||||
* 640.求解方程
|
||||
* @param equation 方程式
|
||||
* @return 解
|
||||
* @see <a href="https://leetcode-cn.com/problems/solve-the-equation/">原题链接</a>
|
||||
*/
|
||||
public String solveEquation(String equation) {
|
||||
int a = 0, b = 0, c = 0, sign = 1, left = 1;
|
||||
boolean hasC = false;
|
||||
for (byte z : equation.getBytes()) {
|
||||
switch (z) {
|
||||
case 'x':
|
||||
a += hasC ? sign * left * c : sign * left;
|
||||
c = 0;
|
||||
hasC = false;
|
||||
break;
|
||||
case '+':
|
||||
b += sign * left * c;
|
||||
c = 0;
|
||||
sign = 1;
|
||||
hasC = false;
|
||||
break;
|
||||
case '-':
|
||||
b += sign * left * c;
|
||||
c = 0;
|
||||
sign = -1;
|
||||
hasC = false;
|
||||
break;
|
||||
case '=':
|
||||
b += sign * left * c;
|
||||
c = 0;
|
||||
sign = 1;
|
||||
left = -1;
|
||||
hasC = false;
|
||||
break;
|
||||
default:
|
||||
c = c * 10 + z - '0';
|
||||
hasC = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
b += sign * left * c;
|
||||
if (a == 0 && b == 0) {
|
||||
return "Infinite solutions";
|
||||
} else if (a == 0) {
|
||||
return "No solution";
|
||||
} else {
|
||||
return "x=" + -b / a;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -88,3 +88,23 @@ class Solution:
|
|||
not (root.left is None or root.right is None or root.left.val != root.right.val) and \
|
||||
self.isSymmetric(TreeNode(0, root.left.left, root.right.right)) and \
|
||||
self.isSymmetric(TreeNode(0, root.left.right, root.right.left))
|
||||
|
||||
def solveEquation(self, equation: str) -> str:
|
||||
"""
|
||||
640. 求解方程
|
||||
:param equation: 方程式
|
||||
:return: 解
|
||||
"""
|
||||
a, b, c, sign, left, has_c = 0, 0, 0, 1, 1, False
|
||||
for z in equation:
|
||||
match z:
|
||||
case 'x': a, c, has_c = a + (sign * left * c if has_c else sign * left), 0, False
|
||||
case '+': b, c, sign, has_c = b + sign * left * c, 0, 1, False
|
||||
case '-': b, c, sign, has_c = b + sign * left * c, 0, -1, False
|
||||
case '=': b, c, sign, left, has_c = b + sign * left * c, 0, 1, -1, False
|
||||
case _: c, has_c = c * 10 + int(z), True
|
||||
b += sign * left * c
|
||||
match (a, b):
|
||||
case (0, 0): return "Infinite solutions"
|
||||
case (0, _): return "No solution"
|
||||
case _: return f"x={-b // a}"
|
||||
|
|
|
@ -30,7 +30,7 @@ impl Solution {
|
|||
/// * 字符串
|
||||
/// * 模拟
|
||||
pub fn solve_equation(equation: String) -> String {
|
||||
let (mut a,mut b,mut c) = (0, 0, 0);
|
||||
/*let (mut a,mut b,mut c) = (0, 0, 0);
|
||||
let mut sign = 1;
|
||||
let mut left = 1;
|
||||
let mut has_c = false;
|
||||
|
@ -71,6 +71,19 @@ impl Solution {
|
|||
(0, 0) => "Infinite solutions".to_owned(),
|
||||
(0, _) => "No solution".to_owned(),
|
||||
_ => format!("x={}", -b / a)
|
||||
}*/
|
||||
match equation.into_bytes().into_iter().fold((0, 0, 0, 1, 1, false), |(a, b, c, sign, left, has_c), z| match z {
|
||||
b'x' => (a + if has_c { sign * left * c } else { sign * left }, b, 0, sign, left, false),
|
||||
b'+' => (a, b + sign * left * c, 0, 1, left, false),
|
||||
b'-' => (a, b + sign * left * c, 0, -1, left, false),
|
||||
b'=' => (a, b + sign * left * c, 0, 1, -1, false),
|
||||
_ => (a, b, c * 10 + (z - b'0') as i32, sign, left, true)
|
||||
}) {
|
||||
(a, b, c, sign, left, _) => match (a, b + sign * left * c) {
|
||||
(0, 0) => "Infinite solutions".to_owned(),
|
||||
(0, _) => "No solution".to_owned(),
|
||||
(_, b) => format!("x={}", -b / a)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue