640.求解方程 其他实现

This commit is contained in:
游由 2022-08-10 14:30:23 +08:00
parent f1d65b92f1
commit bebc20c212
9 changed files with 249 additions and 4 deletions

View File

@ -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);
};

42
JavaScript/q0604.js Normal file
View File

@ -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");

36
TypeScript/q0604.ts Normal file
View File

@ -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");

View File

@ -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

View File

@ -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
};
}
}
}

View File

@ -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);
}
}
};
/**

View File

@ -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;
}
}
}

View File

@ -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}"

View File

@ -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)
}
}
}
}