Golang每日一练(leetDay0093) 丢失的数字、整数转换英文表示

简介: Golang每日一练(leetDay0093) 丢失的数字、整数转换英文表示

268. 丢失的数字 Missing Number

给定一个包含 [0, n]n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。

示例 1:

输入:nums = [3,0,1]

输出:2

解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。

示例 2:

输入:nums = [0,1]

输出:2

解释:n = 2,因为有 2 个数字,所以所有的数字都在范围 [0,2] 内。2 是丢失的数字,因为它没有出现在 nums 中。

示例 3:

输入:nums = [9,6,4,2,3,5,7,0,1]

输出:8

解释:n = 9,因为有 9 个数字,所以所有的数字都在范围 [0,9] 内。8 是丢失的数字,因为它没有出现在 nums 中。

示例 4:

输入:nums = [0]

输出:1

解释:n = 1,因为有 1 个数字,所以所有的数字都在范围 [0,1] 内。1 是丢失的数字,因为它没有出现在 nums 中。


提示:

  • n == nums.length
  • 1 <= n <= 10^4
  • 0 <= nums[i] <= n
  • nums 中的所有数字都 独一无二

进阶:你能否实现线性时间复杂度、仅使用额外常数空间的算法解决此问题?

代码1:求和

package main
import "fmt"
func missingNumber(nums []int) int {
  n := len(nums)
  sum := n * (n + 1) / 2 // 求出 0 到 n 的总和
  for _, num := range nums {
    sum -= num // 减去 nums 中所有数的总和
  }
  return sum // 剩余的就是缺失的数字
}
func main() {
  nums := []int{3, 0, 1}
  fmt.Println(missingNumber(nums))
  nums = []int{0, 1}
  fmt.Println(missingNumber(nums))
  nums = []int{9, 6, 4, 2, 3, 5, 7, 0, 1}
  fmt.Println(missingNumber(nums))
  nums = []int{0}
  fmt.Println(missingNumber(nums))
}

代码2:哈希表

package main
import "fmt"
func missingNumber(nums []int) int {
  numMap := make(map[int]bool) // 定义一个 map,用于记录数组中的数字
  for _, num := range nums {
    numMap[num] = true // 将 nums 数组中的数添加到 map 的键中
  }
  for i := 0; i <= len(nums); i++ {
    if !numMap[i] { // 如果 i 不在 map 的键中,则说明该数字缺失
      return i
    }
  }
  return -1 // 不可能到达这里,只是为了编译不报错
}
func main() {
  nums := []int{3, 0, 1}
  fmt.Println(missingNumber(nums))
  nums = []int{0, 1}
  fmt.Println(missingNumber(nums))
  nums = []int{9, 6, 4, 2, 3, 5, 7, 0, 1}
  fmt.Println(missingNumber(nums))
  nums = []int{0}
  fmt.Println(missingNumber(nums))
}

代码3:位运算

package main
import "fmt"
func missingNumber(nums []int) int {
    missing := len(nums) // 初始化为缺失的数字,因为 nums 是缺失一个数字的序列,所以就是 len(nums)
    for i, num := range nums {
        missing ^= i ^ num // 使用异或运算寻找缺失的数字
    }
    return missing
}
func main() {
  nums := []int{3, 0, 1}
  fmt.Println(missingNumber(nums))
  nums = []int{0, 1}
  fmt.Println(missingNumber(nums))
  nums = []int{9, 6, 4, 2, 3, 5, 7, 0, 1}
  fmt.Println(missingNumber(nums))
  nums = []int{0}
  fmt.Println(missingNumber(nums))
}

输出:

2

2

8

1


273. 整数转换英文表示 Integer To English Words

将非负整数 num 转换为其对应的英文表示。

示例 1:

输入:num = 123

输出:"One Hundred Twenty Three"


示例 2:

输入:num = 12345

输出:"Twelve Thousand Three Hundred Forty Five"


示例 3:

输入:num = 1234567

输出:"One Million Two Hundred Thirty Four Thousand Five Hundred Sixty Seven"


提示:

  • 0 <= num <= 2^31 - 1

代码:

package main
import (
  "fmt"
  "strings"
)
var belowTwenty = []string{
  "", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten",
  "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen",
}
var tens = []string{
  "", "Ten", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety",
}
var thousands = []string{
  "", "Thousand", "Million", "Billion",
}
func numberToWords(num int) string {
  if num == 0 {
    return "Zero"
  }
  res := ""
  i := 0
  for num > 0 {
    if num%1000 != 0 {
      res = helper(num%1000) + thousands[i] + " " + res
    }
    num /= 1000
    i++
  }
  return strings.TrimSpace(res)
}
func helper(num int) string {
  if num == 0 {
    return ""
  } else if num < 20 {
    return belowTwenty[num] + " "
  } else if num < 100 {
    return tens[num/10] + " " + helper(num%10)
  } else { // num >= 100
    return belowTwenty[num/100] + " Hundred " + helper(num%100)
  }
}
func main() {
  fmt.Println(numberToWords(123))
  fmt.Println(numberToWords(12345))
  fmt.Println(numberToWords(1234567))
}

输出:

One Hundred Twenty Three

Twelve Thousand Three Hundred Forty Five

One Million Two Hundred Thirty Four Thousand Five Hundred Sixty Seven


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力!

🌟 收藏,你的青睐是我努力的方向!

评论,你的意见是我进步的财富!  

主页:https://hannyang.blog.csdn.net/

Rust每日一练 专栏

(2023.5.16~)更新中...

Golang每日一练 专栏

(2023.3.11~)更新中...

Python每日一练 专栏

(2023.2.18~2023.5.18)暂停更

C/C++每日一练 专栏

(2023.2.18~2023.5.18)暂停更

Java每日一练 专栏

(2023.3.11~2023.5.18)暂停更


目录
相关文章
|
6月前
|
Shell Linux 算法
Shell编程——弱数据类型的脚本语言快速入门指南
Shell编程——弱数据类型的脚本语言快速入门指南
93 0
Shell编程——弱数据类型的脚本语言快速入门指南
|
6月前
|
Go Linux Shell
Linux 终端命令之文件浏览(2) more
Linux 终端命令之文件浏览(2) more
65 0
Linux 终端命令之文件浏览(2) more
|
6月前
|
Shell 机器学习/深度学习 Linux
Linux 终端操作命令(2)内部命令
Linux 终端操作命令(2)内部命令
61 0
Linux 终端操作命令(2)内部命令
|
6月前
|
C++ 算法 存储
力扣 C++|一题多解之动态规划专题(2)
力扣 C++|一题多解之动态规划专题(2)
62 0
力扣 C++|一题多解之动态规划专题(2)
|
6月前
|
Python 索引
Python Numpy入门基础(一)创建数组
Python Numpy入门基础(一)创建数组
71 0
Python Numpy入门基础(一)创建数组
|
6月前
|
Java 容器 程序员
Java语言程序设计试卷6套
Java语言程序设计试卷6套
742 0
Java语言程序设计试卷6套
|
6月前
|
Java Go C++
Golang每日一练(leetDay0120) 反转字符串中的元音字母、前K个高频元素
Golang每日一练(leetDay0120) 反转字符串中的元音字母、前K个高频元素
67 0
Golang每日一练(leetDay0120) 反转字符串中的元音字母、前K个高频元素
|
6月前
|
Go 机器学习/深度学习 Rust
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String
87 0
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String
|
2月前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
114 4
Golang语言之管道channel快速入门篇
|
2月前
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
67 4
Golang语言文件操作快速入门篇