69.Sqrt(x)修改
This commit is contained in:
parent
8a4ab3e507
commit
70fbfabb95
|
@ -18,12 +18,12 @@ var xorOperation = function (n, start) {
|
||||||
var mySqrt = function (x) {
|
var mySqrt = function (x) {
|
||||||
const xHalf = 0.5 * x;
|
const xHalf = 0.5 * x;
|
||||||
let i = new BigInt64Array(new Float64Array([x]).buffer)[0];
|
let i = new BigInt64Array(new Float64Array([x]).buffer)[0];
|
||||||
i = 0x5FE6EC85E7DE30DAn - (i >> 1n);
|
i = 0x1FF7A3BEA91D9B1Bn + (i >> 1n);
|
||||||
let f = new Float64Array(new BigInt64Array([i]).buffer)[0];
|
let f = new Float64Array(new BigInt64Array([i]).buffer)[0];
|
||||||
f = f * (1.5 - xHalf * f * f);
|
f = f * 0.5 + xHalf / f;
|
||||||
f = f * (1.5 - xHalf * f * f);
|
f = f * 0.5 + xHalf / f;
|
||||||
f = f * (1.5 - xHalf * f * f);
|
f = f * 0.5 + xHalf / f;
|
||||||
return Math.floor(1.0 / f);
|
return Math.floor(f);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -17,5 +17,22 @@ namespace my_leetcode
|
||||||
{
|
{
|
||||||
return new int[4] { nums.Length, 1, nums.Length + 1, 0 }[nums.Length & 3] ^ nums.Aggregate(0, (o, n) => o ^ n);
|
return new int[4] { nums.Length, 1, nums.Length + 1, 0 }[nums.Length & 3] ^ nums.Aggregate(0, (o, n) => o ^ n);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 69.Sqrt(x)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="x">x</param>
|
||||||
|
/// <returns>平方根</returns>
|
||||||
|
public int MySqrt(int x)
|
||||||
|
{
|
||||||
|
double xHalf = 0.5 * x;
|
||||||
|
long i = BitConverter.DoubleToInt64Bits(x);
|
||||||
|
i = 0x1FF7A3BEA91D9B1B + (i >> 1);
|
||||||
|
double f = BitConverter.Int64BitsToDouble(i);
|
||||||
|
f = f * 0.5 + xHalf / f;
|
||||||
|
f = f * 0.5 + xHalf / f;
|
||||||
|
f = f * 0.5 + xHalf / f;
|
||||||
|
return (int)f;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,11 +39,11 @@ int Solution::mySqrt(int x) {
|
||||||
};
|
};
|
||||||
double xHalf = 0.5 * x;
|
double xHalf = 0.5 * x;
|
||||||
f = x;
|
f = x;
|
||||||
i = 0x5FE6EC85E7DE30DALL - (i >> 1);
|
i = 0x1FF7A3BEA91D9B1B + (i >> 1);
|
||||||
f = f * (1.5 - xHalf * f * f); // 牛顿迭代法,重复此句可提高精度
|
f = f * 0.5 + xHalf / f; // 牛顿迭代法,重复此句可提高精度
|
||||||
f = f * (1.5 - xHalf * f * f);
|
f = f * 0.5 + xHalf / f;
|
||||||
f = f * (1.5 - xHalf * f * f); // 三次迭代
|
f = f * 0.5 + xHalf / f; // 三次迭代
|
||||||
return int(1.0 / f);
|
return f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,19 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
import "math"
|
||||||
|
|
||||||
|
// 69.Sqrt(x)
|
||||||
|
func mySqrt(x int) int {
|
||||||
|
var xHalf = 0.5 * float64(x)
|
||||||
|
var i = math.Float64bits(float64(x))
|
||||||
|
i = 0x1FF7A3BEA91D9B1B + (i >> 1)
|
||||||
|
var f = math.Float64frombits(i)
|
||||||
|
f = f * 0.5 + xHalf / f
|
||||||
|
f = f * 0.5 + xHalf / f
|
||||||
|
f = f * 0.5 + xHalf / f
|
||||||
|
return int(f)
|
||||||
|
}
|
||||||
|
|
||||||
// 268.丢失的数字
|
// 268.丢失的数字
|
||||||
func missingNumber(nums []int) int {
|
func missingNumber(nums []int) int {
|
||||||
x := 0
|
x := 0
|
||||||
|
|
|
@ -15,12 +15,12 @@ public class Solution {
|
||||||
public int mySqrt(int x) {
|
public int mySqrt(int x) {
|
||||||
double xHalf = 0.5 * x;
|
double xHalf = 0.5 * x;
|
||||||
long i = Double.doubleToLongBits(x);
|
long i = Double.doubleToLongBits(x);
|
||||||
i = 0x5FE6EC85E7DE30DAL - (i >> 1);
|
i = 0x1FF7A3BEA91D9B1BL + (i >> 1);
|
||||||
double f = Double.longBitsToDouble(i);
|
double f = Double.longBitsToDouble(i);
|
||||||
f = f * (1.5 - xHalf * f * f);
|
f = f * 0.5 + xHalf / f;
|
||||||
f = f * (1.5 - xHalf * f * f);
|
f = f * 0.5 + xHalf / f;
|
||||||
f = f * (1.5 - xHalf * f * f);
|
f = f * 0.5 + xHalf / f;
|
||||||
return (int)(1.0 / f);
|
return (int) f;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int deleteAndEarn(int[] nums) {
|
public int deleteAndEarn(int[] nums) {
|
||||||
|
|
|
@ -37,3 +37,19 @@ class Solution:
|
||||||
|
|
||||||
def missingNumber(self, nums: List[int]) -> int:
|
def missingNumber(self, nums: List[int]) -> int:
|
||||||
return [len(nums), 1, len(nums) + 1, 0][len(nums) & 3] ^ functools.reduce(lambda o, n: o ^ n, nums, 0)
|
return [len(nums), 1, len(nums) + 1, 0][len(nums) & 3] ^ functools.reduce(lambda o, n: o ^ n, nums, 0)
|
||||||
|
|
||||||
|
def mySqrt(self, x: int) -> int:
|
||||||
|
"""
|
||||||
|
# 69.Sqrt(x)
|
||||||
|
:param x: x
|
||||||
|
:return: 平方根
|
||||||
|
"""
|
||||||
|
import struct
|
||||||
|
x_half = 0.5 * x
|
||||||
|
i = struct.unpack("Q", struct.pack("d", float(x)))[0]
|
||||||
|
i = 0x1FF7A3BEA91D9B1B + (i >> 1)
|
||||||
|
f = struct.unpack("d", struct.pack("Q", i))[0]
|
||||||
|
f = f * 0.5 + x_half / f
|
||||||
|
f = f * 0.5 + x_half / f
|
||||||
|
f = f * 0.5 + x_half / f
|
||||||
|
return int(f)
|
||||||
|
|
|
@ -12,6 +12,7 @@ mod q0045;
|
||||||
mod q0046;
|
mod q0046;
|
||||||
mod q0053;
|
mod q0053;
|
||||||
mod q0055;
|
mod q0055;
|
||||||
|
mod q0069;
|
||||||
mod q0070;
|
mod q0070;
|
||||||
mod q0080;
|
mod q0080;
|
||||||
mod q0081;
|
mod q0081;
|
||||||
|
|
|
@ -0,0 +1,128 @@
|
||||||
|
use crate::Solution;
|
||||||
|
|
||||||
|
|
||||||
|
impl Solution {
|
||||||
|
/// [69.Sqrt(x)](https://leetcode-cn.com/problems/sqrtx/)
|
||||||
|
///
|
||||||
|
/// 2021-11-11 11:00:34
|
||||||
|
///
|
||||||
|
/// 给你一个非负整数 `x` ,计算并返回 `x` 的 **算术平方根** 。
|
||||||
|
///
|
||||||
|
/// 由于返回类型是整数,结果只保留 **整数部分** ,小数部分将被 **舍去 。**
|
||||||
|
///
|
||||||
|
/// **注意:** 不允许使用任何内置指数函数和算符,例如 `pow(x, 0.5)` 或者 `x * 0.5` 。
|
||||||
|
///
|
||||||
|
/// * **示例 1:**
|
||||||
|
/// + **输入:** x = 4
|
||||||
|
/// + **输出:** 2
|
||||||
|
/// * **示例 2:**
|
||||||
|
/// + **输入:** x = 8
|
||||||
|
/// + **输出:** 2
|
||||||
|
/// + **解释:** 8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
|
||||||
|
/// * **提示:**
|
||||||
|
/// * `0 <= x <= 2^31 - 1`
|
||||||
|
/// * Related Topics
|
||||||
|
/// + 数学
|
||||||
|
/// + 二分查找
|
||||||
|
///
|
||||||
|
/// * 👍 823
|
||||||
|
/// * 👎 0
|
||||||
|
/// # 方法1 内置函数
|
||||||
|
/// ```rust
|
||||||
|
/// pub fn my_sqrt(x: i32) -> i32 {
|
||||||
|
/// (x as f32).sqrt() as i32
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
|
/// # 方法2 牛顿迭代法
|
||||||
|
/// f(x) = x^2 - c 的零点,令x0=c,取f(x)在点(x0, f(x0))处切线的与x轴交点的坐标x1,迭代上一步。
|
||||||
|
/// ## 源码
|
||||||
|
/// ```rust
|
||||||
|
/// pub fn my_sqrt(x: i32) -> i32 {
|
||||||
|
/// if x == 0 {
|
||||||
|
/// return 0;
|
||||||
|
/// }
|
||||||
|
/// let c = x as f64;
|
||||||
|
/// let mut x0 = x as f64;
|
||||||
|
/// loop {
|
||||||
|
/// let xi = 0.5 * (x0 + c / x0);
|
||||||
|
/// if (x0 - xi).abs() < 1e-7 {
|
||||||
|
/// break;
|
||||||
|
/// }
|
||||||
|
/// x0 = xi;
|
||||||
|
/// }
|
||||||
|
/// x0 as i32
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
|
/// # 方法3 二分查找法
|
||||||
|
/// 实现见源码
|
||||||
|
/// ## 源码
|
||||||
|
/// ```rust
|
||||||
|
/// pub fn my_sqrt(x: i32) -> i32 {
|
||||||
|
/// let (mut l, mut r, mut ans) = (0, x, -1);
|
||||||
|
/// while l <= r {
|
||||||
|
/// let mid = l + (r - l) / 2;
|
||||||
|
/// if mid as i64 * mid as i64 <= x as i64 {
|
||||||
|
/// ans = mid;
|
||||||
|
/// l = mid + 1;
|
||||||
|
/// } else {
|
||||||
|
/// r = mid - 1;
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// ans
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
|
/// # 方法4 袖珍计算器算法
|
||||||
|
/// 使用指数函数和对数函数替换平方根函数的方法
|
||||||
|
/// ## 源码
|
||||||
|
/// ```rust
|
||||||
|
/// pub fn my_sqrt(x: i32) -> i32 {
|
||||||
|
/// let ans = (0.5f64 * (x as f64).ln()).exp() as i32;
|
||||||
|
/// if (ans + 1) as i64 * (ans + 1) as i64 <= x as i64 {
|
||||||
|
/// ans + 1
|
||||||
|
/// } else {
|
||||||
|
/// ans
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
|
/// # 方法5 卡马克快速平方根倒数
|
||||||
|
/// ```rust
|
||||||
|
/// pub fn my_sqrt(x: i32) -> i32 {
|
||||||
|
/// unsafe {
|
||||||
|
/// union X2f {
|
||||||
|
/// i: i64,
|
||||||
|
/// f: f64,
|
||||||
|
/// }
|
||||||
|
/// let x_half = 0.5f64 * x as f64;
|
||||||
|
/// let mut u = X2f { f: x as f64 };
|
||||||
|
/// u.i = 0x5FE6EC85E7DE30DA_i64 - (u.i >> 1);
|
||||||
|
/// u.f = u.f * (1.5f64 - x_half * u.f * u.f); // 牛顿迭代法
|
||||||
|
/// u.f = u.f * (1.5f64 - x_half * u.f * u.f);
|
||||||
|
/// u.f = u.f * (1.5f64 - x_half * u.f * u.f); // 三次迭代
|
||||||
|
/// return (1.0f64 / u.f) as i32;
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
|
pub fn my_sqrt(x: i32) -> i32 {
|
||||||
|
let x_half = 0.5 * x as f64;
|
||||||
|
let mut i = (x as f64).to_bits();
|
||||||
|
i = 0x1FF7A3BEA91D9B1B + (i >> 1);
|
||||||
|
let mut f = f64::from_bits(i);
|
||||||
|
f = 0.5 * f + x_half / f;
|
||||||
|
f = 0.5 * f + x_half / f;
|
||||||
|
f = 0.5 * f + x_half / f;
|
||||||
|
f as i32
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use crate::Solution;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_q0069() {
|
||||||
|
let x = 2147395599;
|
||||||
|
let i = Solution::my_sqrt(x);
|
||||||
|
assert_eq!(i, 46339);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1932,95 +1932,6 @@ impl Solution {
|
||||||
ret
|
ret
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 69.x的平方根
|
|
||||||
///
|
|
||||||
/// [原题链接](https://leetcode-cn.com/problems/sqrtx/)
|
|
||||||
/// # 方法1 内置函数
|
|
||||||
/// ```rust
|
|
||||||
/// pub fn my_sqrt(x: i32) -> i32 {
|
|
||||||
/// (x as f32).sqrt() as i32
|
|
||||||
/// }
|
|
||||||
/// ```
|
|
||||||
/// # 方法2 牛顿迭代法
|
|
||||||
/// f(x) = x^2 - c 的零点,令x0=c,取f(x)在点(x0, f(x0))处切线的与x轴交点的坐标x1,迭代上一步。
|
|
||||||
/// ## 源码
|
|
||||||
/// ```rust
|
|
||||||
/// pub fn my_sqrt(x: i32) -> i32 {
|
|
||||||
/// if x == 0 {
|
|
||||||
/// return 0;
|
|
||||||
/// }
|
|
||||||
/// let c = x as f64;
|
|
||||||
/// let mut x0 = x as f64;
|
|
||||||
/// loop {
|
|
||||||
/// let xi = 0.5 * (x0 + c / x0);
|
|
||||||
/// if (x0 - xi).abs() < 1e-7 {
|
|
||||||
/// break;
|
|
||||||
/// }
|
|
||||||
/// x0 = xi;
|
|
||||||
/// }
|
|
||||||
/// x0 as i32
|
|
||||||
/// }
|
|
||||||
/// ```
|
|
||||||
/// # 方法3 二分查找法
|
|
||||||
/// 实现见源码
|
|
||||||
/// ## 源码
|
|
||||||
/// ```rust
|
|
||||||
/// pub fn my_sqrt(x: i32) -> i32 {
|
|
||||||
/// let (mut l, mut r, mut ans) = (0, x, -1);
|
|
||||||
/// while l <= r {
|
|
||||||
/// let mid = l + (r - l) / 2;
|
|
||||||
/// if mid as i64 * mid as i64 <= x as i64 {
|
|
||||||
/// ans = mid;
|
|
||||||
/// l = mid + 1;
|
|
||||||
/// } else {
|
|
||||||
/// r = mid - 1;
|
|
||||||
/// }
|
|
||||||
/// }
|
|
||||||
/// ans
|
|
||||||
/// }
|
|
||||||
/// ```
|
|
||||||
/// # 方法4 袖珍计算器算法
|
|
||||||
/// 使用指数函数和对数函数替换平方根函数的方法
|
|
||||||
/// ## 源码
|
|
||||||
/// ```rust
|
|
||||||
/// pub fn my_sqrt(x: i32) -> i32 {
|
|
||||||
/// let ans = (0.5f64 * (x as f64).ln()).exp() as i32;
|
|
||||||
/// if (ans + 1) as i64 * (ans + 1) as i64 <= x as i64 {
|
|
||||||
/// ans + 1
|
|
||||||
/// } else {
|
|
||||||
/// ans
|
|
||||||
/// }
|
|
||||||
/// }
|
|
||||||
/// ```
|
|
||||||
/// # 方法5 卡马克快速平方根倒数
|
|
||||||
/// ```rust
|
|
||||||
/// pub fn my_sqrt(x: i32) -> i32 {
|
|
||||||
/// unsafe {
|
|
||||||
/// union X2f {
|
|
||||||
/// i: i64,
|
|
||||||
/// f: f64,
|
|
||||||
/// }
|
|
||||||
/// let x_half = 0.5f64 * x as f64;
|
|
||||||
/// let mut u = X2f { f: x as f64 };
|
|
||||||
/// u.i = 0x5FE6EC85E7DE30DA_i64 - (u.i >> 1);
|
|
||||||
/// u.f = u.f * (1.5f64 - x_half * u.f * u.f); // 牛顿迭代法
|
|
||||||
/// u.f = u.f * (1.5f64 - x_half * u.f * u.f);
|
|
||||||
/// u.f = u.f * (1.5f64 - x_half * u.f * u.f); // 三次迭代
|
|
||||||
/// return (1.0f64 / u.f) as i32;
|
|
||||||
/// }
|
|
||||||
/// }
|
|
||||||
/// ```
|
|
||||||
pub fn my_sqrt(x: i32) -> i32 {
|
|
||||||
let x_half = 0.5f64 * x as f64;
|
|
||||||
let mut i = (x as f64).to_bits();
|
|
||||||
i = 0x5FE6EC85E7DE30DA_u64 - (i >> 1);
|
|
||||||
let mut f = f64::from_bits(i);
|
|
||||||
f = f * (1.5 - x_half * f * f);
|
|
||||||
f = f * (1.5 - x_half * f * f);
|
|
||||||
f = f * (1.5 - x_half * f * f);
|
|
||||||
(1.0f64 / f) as i32
|
|
||||||
}
|
|
||||||
|
|
||||||
/// 172.阶乘后的零
|
/// 172.阶乘后的零
|
||||||
///
|
///
|
||||||
/// [原题链接](https://leetcode-cn.com/problems/factorial-trailing-zeroes/)
|
/// [原题链接](https://leetcode-cn.com/problems/factorial-trailing-zeroes/)
|
||||||
|
@ -3746,14 +3657,6 @@ mod tests {
|
||||||
assert_eq!(d, i32::MAX);
|
assert_eq!(d, i32::MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_my_sqrt() {
|
|
||||||
let x = 2147395599;
|
|
||||||
let i = Solution::my_sqrt(x);
|
|
||||||
//println!("{}", i);
|
|
||||||
assert_eq!(i, 46339);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_remove_stones() {
|
fn test_remove_stones() {
|
||||||
let stones = vec![vec![0, 0], vec![0, 1], vec![1, 0], vec![1, 2], vec![2, 1], vec![2, 2]];
|
let stones = vec![vec![0, 0], vec![0, 1], vec![1, 0], vec![1, 2], vec![2, 1], vec![2, 2]];
|
||||||
|
|
Loading…
Reference in New Issue