前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode中级算法-数学(2)

LeetCode中级算法-数学(2)

作者头像
码农帮派
发布2021-01-12 14:57:25
2610
发布2021-01-12 14:57:25
举报
文章被收录于专栏:码农帮派码农帮派

Pow(x, n)

[题目]

实现 pow(x, n) ,即计算 x 的 n 次幂函数。

[输入1]

代码语言:javascript
复制
2.00000, 10

[返回1]

代码语言:javascript
复制
1024.00000

[输入2]

代码语言:javascript
复制
2.10000, 3

[返回2]

代码语言:javascript
复制
9.26100

[输入3]

代码语言:javascript
复制
2.00000, -2

[返回3]

代码语言:javascript
复制
0.25000

[解法]

[代码实现]

代码语言:javascript
复制
package main

import "fmt"

func main() {
  input := float64(2.1)
  result := computeResult(input, 3)
  fmt.Println("result:", result)
}

func computeResult(target float64, num int) float64 {
  if num < 0 {
    num = num * (-1)
    target = 1 / target
  }

  result := float64(1)
  for i := 0; i < num; i ++ {
    result = result * target
  }

  return result
}

x 的平方根

[题目]

实现 int sqrt(int x) 函数。

[输入1]

代码语言:javascript
复制
4

[返回1]

代码语言:javascript
复制
2

[输入2]

代码语言:javascript
复制
8

[返回2]

代码语言:javascript
复制
2

说明:8的平方根是2.82842...,由于返回类型是整数,小数部分将被舍去。

[解法]

使用二分查找,需要注意的是因为只保留整数部分,我们找到平方根的平方结果只可能小于target,基于以上的分析,在二分查找的时候,在缩小范围的时候,要是结果小于target都进行缓存,这样保证有结果

[代码实现]

代码语言:javascript
复制
package main

import "fmt"

func main() {
  input := 8
  result := computeResult(input)
  fmt.Println("result:", result)
}

func computeResult(input int) int {
  left, right := 0, input
  result := 1
  for left <= right {
    mid := (left + right) / 2
    if mid * mid > input {
      right = mid - 1
    } else {
      result = mid
      left = mid + 1
    }
  }

  return result
}

两数相除

[题目]

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。

返回被除数 dividend 除以除数 divisor 得到的商。

[输入]

代码语言:javascript
复制
dividend = 10, divisor = 3

[返回]

代码语言:javascript
复制
3

[解法]

使用二分查找,举例说明,被除数10和除数3,那么从1开始尝试有几个3可以组成最靠近10的数字。

[代码实现]

代码语言:javascript
复制
package main

import "fmt"

func main() {
  input := 10
  num := 3
  result := computeResult(input, num)
  fmt.Println("result:", result)
}

// 使用二分查找计算
func computeResult(input int, num int) int {
  left := 0
  right := input
  result := 0
  for left <= right {
    mid := (left + right) / 2
    resItem := _compute(mid, num)
    if input < resItem {
      right = mid - 1
    } else {
      result = mid
      left = mid + 1
    }
  }

  return result
}

func _compute(item int, num int) int {
  result := 0
  for i := 0; i < num; i++ {
    result += item
  }
  return result
}

分数到小数

[题目]

给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数 。

如果小数部分为循环小数,则将循环的部分括在括号内。

[输入1]

代码语言:javascript
复制
numerator = 1, denominator = 2

[返回1]

代码语言:javascript
复制
"0.5"

[输入2]

代码语言:javascript
复制
numerator = 2, denominator = 1

[返回2]

代码语言:javascript
复制
"2"

[输入3]

代码语言:javascript
复制
numerator = 2, denominator = 3

[返回3]

代码语言:javascript
复制
"0.(6)"

[解法]

[代码实现]

代码语言:javascript
复制
package main

import (
  "fmt"
  "strconv"
)

func main() {
  input := 2
  num := 3
  result := computeResult(input, num)
  fmt.Println("result:", result)
}

func computeResult(input int, num int) string {
  temp := input % num
  result := strconv.Itoa(input / num)
  if temp == 0 {
    return result
  }

  result += "."
  filter := map[int]int{}
  for temp != 0 {
    if pos, exists := filter[temp]; exists {
      result = insert(result, pos, "(")
      result += ")"
      return result
    }
    filter[temp] = len(result)
    temp = temp * 10
    result += strconv.Itoa(temp / num)
    temp = temp % num
  }

  return result
}

func insert(input string, pos int, letter string) string {
  return input[:pos] + letter + input[pos:]
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农帮派 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档