
目录
179. 最大数 Largest Number 🌟🌟
187. 重复的DNA序列 Repeated DNA Sequences 🌟🌟
🌟 每日一练刷题专栏 🌟
Golang每日一练 专栏
Python每日一练 专栏
C/C++每日一练 专栏
Java每日一练 专栏
注:175~178、180~185.为SQL专用题,跳过;186. 188. 已提前做了,链接如下:
186. 颠倒字符串里的单词 II Reverse Words In A String II 🌟🌟
188. 买卖股票的最佳时机 IV 🌟🌟🌟
179. 最大数 Largest Number
给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。
示例 1:
输入:nums = [10,2] 输出:"210"
示例 2:
输入:nums = [3,30,34,5,9] 输出:"9534330"
提示:
- 1 <= nums.length <= 100
- 0 <= nums[i] <= 10^9
代码1: 冒泡排序
package main
import (
	"fmt"
	"strconv"
	"strings"
)
func largestNumber(nums []int) string {
	// 将整数转换成字符串
	strs := make([]string, len(nums))
	for i := 0; i < len(nums); i++ {
		strs[i] = strconv.Itoa(nums[i])
	}
	// Bubble Sort
	for i := 0; i < len(nums); i++ {
		for j := i + 1; j < len(nums); j++ {
			if strs[i]+strs[j] < strs[j]+strs[i] {
				strs[i], strs[j] = strs[j], strs[i]
			}
		}
	}
	// 处理前导0
	i := 0
	for i < len(strs) && strs[i] == "0" {
		i++
	}
	// 拼接结果
	res := strings.Join(strs[i:], "")
	if res == "" {
		return "0"
	}
	return res
}
func main() {
	nums := []int{10, 2}
	fmt.Println(largestNumber(nums))
	nums = []int{3, 30, 34, 5, 9}
	fmt.Println(largestNumber(nums))
}
代码2: 快速排序
package main
import (
	"fmt"
	"strconv"
	"strings"
)
func largestNumber(nums []int) string {
	// 将整数转换成字符串
	strs := make([]string, len(nums))
	for i := 0; i < len(nums); i++ {
		strs[i] = strconv.Itoa(nums[i])
	}
	// 定义排序函数
	var sortFn func(i, j int) bool
	sortFn = func(i, j int) bool {
		return strs[i]+strs[j] >= strs[j]+strs[i]
	}
	// 快速排序
	quickSort(strs, sortFn, 0, len(nums)-1)
	// 处理前导0
	i := 0
	for i < len(strs) && strs[i] == "0" {
		i++
	}
	// 拼接结果
	res := strings.Join(strs[i:], "")
	if res == "" {
		return "0"
	}
	return res
}
func quickSort(strs []string, sortFn func(i, j int) bool, start, end int) {
	if start >= end {
		return
	}
	pivot := partition(strs, sortFn, start, end)
	quickSort(strs, sortFn, start, pivot-1)
	quickSort(strs, sortFn, pivot+1, end)
}
func partition(strs []string, sortFn func(i, j int) bool, start, end int) int {
	i := start
	for j := start; j < end; j++ {
		if sortFn(j, end) {
			strs[i], strs[j] = strs[j], strs[i]
			i++
		}
	}
	strs[i], strs[end] = strs[end], strs[i]
	return i
}
func main() {
	nums := []int{10, 2}
	fmt.Println(largestNumber(nums))
	nums = []int{3, 30, 34, 5, 9}
	fmt.Println(largestNumber(nums))
}
代码3: 整数转字符串后排序
package main
import (
	"fmt"
	"sort"
	"strconv"
	"strings"
)
func largestNumber(nums []int) string {
	// 将整数转换成字符串
	strs := make([]string, len(nums))
	for i := 0; i < len(nums); i++ {
		strs[i] = strconv.Itoa(nums[i])
	}
	// 自定义排序函数
	sort.Slice(strs, func(i, j int) bool {
		return strs[i]+strs[j] >= strs[j]+strs[i]
	})
	// 处理前导0
	i := 0
	for i < len(strs) && strs[i] == "0" {
		i++
	}
	// 拼接结果
	res := strings.Join(strs[i:], "")
	if res == "" {
		return "0"
	}
	return res
}
func main() {
	nums := []int{10, 2}
	fmt.Println(largestNumber(nums))
	nums = []int{3, 30, 34, 5, 9}
	fmt.Println(largestNumber(nums))
}
输出:
210
 9534330
187. 重复的DNA序列 Repeated DNA Sequences
DNA序列 由一系列核苷酸组成,缩写为 'A', 'C', 'G' 和 'T'.。
- 例如,"ACGAATTCCG"是一个 DNA序列 。
在研究 DNA 时,识别 DNA 中的重复序列非常有用。
给定一个表示 DNA序列 的字符串 s ,返回所有在 DNA 分子中出现不止一次的 长度为 10 的序列(子字符串)。你可以按 任意顺序 返回答案。
示例 1:
输入:s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT" 输出:["AAAAACCCCC","CCCCCAAAAA"]
示例 2:
输入:s = "AAAAAAAAAAAAA" 输出:["AAAAAAAAAA"]
提示:
- 0 <= s.length <= 10^5
- s[i]- ==- 'A'、- 'C'、- 'G'or- 'T'
代码1: 哈希表
package main
import "fmt"
func findRepeatedDnaSequences(s string) []string {
	// 定义一个哈希表
	cnt := make(map[string]int)
	// 遍历s,将所有长度为10的子串出现的次数存入哈希表
	for i := 0; i <= len(s)-10; i++ {
		cnt[s[i:i+10]]++
	}
	// 找到出现次数超过1的子串即可
	res := make([]string, 0)
	for k, v := range cnt {
		if v > 1 {
			res = append(res, k)
		}
	}
	return res
}
func main() {
	s := "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"
	fmt.Println(findRepeatedDnaSequences(s))
	s = "AAAAAAAAAAAAA"
	fmt.Println(findRepeatedDnaSequences(s))
}
代码2: 滑动窗口+哈希表
package main
import "fmt"
func findRepeatedDnaSequences(s string) []string {
	// 定义一个哈希表
	cnt := make(map[string]int)
	// 定义一个滑动窗口,移动长度为10
	left, right := 0, 9
	for right < len(s) {
		// 统计子串出现的次数
		cnt[s[left:right+1]]++
		left++
		right++
	}
	// 找到出现次数超过1的子串即可
	res := make([]string, 0)
	for k, v := range cnt {
		if v > 1 {
			res = append(res, k)
		}
	}
	return res
}
func main() {
	s := "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"
	fmt.Println(findRepeatedDnaSequences(s))
	s = "AAAAAAAAAAAAA"
	fmt.Println(findRepeatedDnaSequences(s))
}
代码3: 位运算+哈希表
package main
import "fmt"
func findRepeatedDnaSequences(s string) []string {
	// 构造哈希表
	cnt := make(map[int]int)
	// 将 A、C、G、T 四种核苷酸转换成二进制数
	toInt := func(c byte) int {
		switch c {
		case 'A':
			return 0
		case 'C':
			return 1
		case 'G':
			return 2
		case 'T':
			return 3
		}
		return -1
	}
	// 遍历字符串,将每个长度为10的子串存入哈希表
	left := 0
	nums := make([]int, len(s))
	for i := 0; i < len(s); i++ {
		nums[i] = toInt(s[i])
		if i-left+1 > 10 {
			left++
		}
		if i-left+1 == 10 {
			// 使用位运算计算10个二进制数组成的哈希值
			hash := 0
			for j := left; j <= i; j++ {
				hash = (hash << 2) | nums[j]
			}
			cnt[hash]++
		}
	}
	// 找到出现次数大于1的子串即可
	res := make([]string, 0)
	for k, v := range cnt {
		if v > 1 {
			sub := make([]byte, 10)
			for i := 9; i >= 0; i-- {
				sub[i] = byte(k & 3)
				k >>= 2
			}
			for i := 0; i < 10; i++ {
				switch sub[i] {
				case 0:
					sub[i] = 'A'
				case 1:
					sub[i] = 'C'
				case 2:
					sub[i] = 'G'
				case 3:
					sub[i] = 'T'
				}
			}
			res = append(res, string(sub))
		}
	}
	return res
}
func main() {
	s := "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"
	fmt.Println(findRepeatedDnaSequences(s))
	s = "AAAAAAAAAAAAA"
	fmt.Println(findRepeatedDnaSequences(s))
}
输出:
[CCCCCAAAAA AAAAACCCCC]
 [AAAAAAAAAA]
🌟 每日一练刷题专栏 🌟
✨ 持续,努力奋斗做强刷题搬运工!
👍 点赞,你的认可是我坚持的动力!
🌟 收藏,你的青睐是我努力的方向!
✎ 评论,你的意见是我进步的财富!
☸ 主页:https://hannyang.blog.csdn.net/
|  | Golang每日一练 专栏 | 
|  | Python每日一练 专栏 | 
|  | C/C++每日一练 专栏 | 
|  | Java每日一练 专栏 | 


















