题目描述:
给你一个字符串数组 words ,请你找出所有在 words 的每个字符串中都出现的共用字符( 包括重复字符),并以数组形式返回。你可以按 任意顺序 返回答案。
题解:
使用一个数组记录各字符出现的最少次数即可
代码(Go):
func commonChars(words []string) []string {
num := [26]int{}
for i,_ := range num{
num[i] = 100
}
for _,v := range words{
tempnum := [26]int{}
for _,b := range v{
tempnum[int(b - 'a')]++
}
for i,v := range tempnum{
if v < num[i]{
num[i] = v
}
}
}
re := []string{}
for i,v := range num{
temp := v
for temp > 0{
re = append(re,string('a' + i))
temp--
}
}
return re
}
题目描述:
小镇里有 n 个人,按从 1 到 n 的顺序编号。传言称,这些人中有一个暗地里是小镇法官。
如果小镇法官真的存在,那么:
小镇法官不会信任任何人。
每个人(除了小镇法官)都信任这位小镇法官。
只有一个人同时满足属性 1 和属性 2 。
给你一个数组 trust ,其中 trust[i] = [ai, bi] 表示编号为 ai 的人信任编号为 bi 的人。
如果小镇法官存在并且可以确定他的身份,请返回该法官的编号;否则,返回 -1 。
题解:
先统计所有人被信任的次数,再查看被信任次数为n-1的人是否信任别人。看官方题解才发现这是个图的出度入度问题,只需要统计一下出度入度就可以了
代码(Go):
func findJudge(n int, trust [][]int) int {
if n == 1{
return 1
}
num := make([]int,n + 1)
for _,v := range trust{
num[v[1]]++
}
for i,v := range num{
if v == n - 1{
flag := 1
for _,x := range trust{
if x[0] == i{
flag = 0
break
}
}
if flag == 1{
return i
}
}
}
return -1
}
题目描述:
给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。
返回 你可以获得的最大乘积 。
题解:
这个题我记得好像是去年笔试做过的原题,可以用动态规划做,但实际上只要尽可能的拆出3来就可以了,最后如果剩1就与一个3合起来乘4,剩2就乘2即可
代码(Go):
func integerBreak(n int) int {
if n <= 3 {
return n - 1
}
quotient := n / 3
remainder := n % 3
if remainder == 0 {
return int(math.Pow(3, float64(quotient)))
} else if remainder == 1 {
return int(math.Pow(3, float64(quotient - 1))) * 4
}
return int(math.Pow(3, float64(quotient))) * 2
}
题目描述:
你将会获得一系列视频片段,这些片段来自于一项持续时长为 time 秒的体育赛事。这些片段可能有所重叠,也可能长度不一。
使用数组 clips 描述所有的视频片段,其中 clips[i] = [starti, endi] 表示:某个视频片段开始于 starti 并于 endi 结束。
甚至可以对这些片段自由地再剪辑:
例如,片段 [0, 7] 可以剪切成 [0, 1] + [1, 3] + [3, 7] 三部分。
我们需要将这些片段进行再剪辑,并将剪辑后的内容拼接成覆盖整个运动过程的片段([0, time])。返回所需片段的最小数目,如果无法完成该任务,则返回 -1 。
题解:
和之前能否跳到终点的题本质上是一样的,可以先通过建立一个数组保存每个start点能到达的最远距离,这个题就完全转换成了能否跳到终点的问题,通过维护一个最远距离,计算小于当前最远距离的最大距离,当i到达当前最远距离时,片段数量加一并更改最远距离,若max>=time说明可以到达
代码(Go):
func videoStitching(clips [][]int, time int) int {
maxtime := make([]int,time + 1)
for _,v := range clips{
if v[0] < time && maxtime[v[0]] < v[1]{
maxtime[v[0]] = v[1]
}
}
max := 0
temp := 0
re := 0
for i := 0;i <= max;i++{
if maxtime[i] > temp{
temp = maxtime[i]
}
if i == max{
re++
max = temp
}
if max >= time{
return re
}
}
return -1
}
两道动态规划题都没有用动态规划做,明天继续动态规划