题目:最长公共前缀
题目描述:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入: [“flower”,“flow”,“flight”]
输出: “fl”
示例 2:
输入: [“dog”,“racecar”,“car”]
输出: “”
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z 。
分析:暴力法,直接以第一个为参照,依次循环比较,但要注意的是,不要上来就盲目比较,要找到最短的元素,短板效应,否则go语言会报错(溢出)
代码:
func longestCommonPrefix(strs []string) string {
n:=len(strs)
if n==0{
return ""
}
min:=len(strs[0])
for i:=1;i<n;i++{
if len(strs[i])<min{
min=len(strs[i])
}
}
count:=0
flag:=0
for j:=0;j<min;j++{
for i:=1;i<n;i++{
if string(strs[i][j])!=string(strs[0][j]){
flag=1
break
}
}
if flag==1{
break
}
count++
}
res:=[]string{}
for i:=0;i<count;i++{
res=append(res,string(strs[0][i]))
}
return strings.Join(res,"")
}
题目:子集
题目描述:
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
分析:一开始我想要递归求解,我天真的以为切片的引用可以解决一切事情,事实证明我错了,之后我会专门写一篇关于切片引用传参的博客,后来看了别人的代码,用的位运算,感觉方法不是很好,之后想到好的再改进吧。
代码:
func subsets(nums []int) [][]int {
res:=[][]int{}
if len(nums)==0{
pre:=[]int{}
res=append(res,pre)
return res
}
len:=float64(len(nums))
a:=int(math.Pow(2.0,len))
res=make([][]int,0,a)
n:=0
for n<a{
subset :=[]int{}
index:=0
tmp:=n
for tmp>0{
if tmp&1==1{
subset=append(subset,nums[index])
}
index+=1
tmp=tmp>>1
}
n+=1
res=append(res,subset)
}
return res
}