每日编程(二十八)

题目:最长公共前缀

题目描述:
编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 “”。

示例 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,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

示例:

扫描二维码关注公众号,回复: 5560114 查看本文章

输入: 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
}

猜你喜欢

转载自blog.csdn.net/LYue123/article/details/88357974