高薪算法+计算机职称考试LeetCodeSwift in LeetCode

1002. 查找常用字符

2019-07-25  本文已影响5人  1江春水

【题目描述】
给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。

你可以按任意顺序返回答案。

【示例1】

输入:["bella","label","roller"]
输出:["e","l","l"]

【示例2】

输入:["cool","lock","cook"]
输出:["c","o"]

【提示】

1 <= A.length <= 100
1 <= A[i].length <= 100
A[i][j] 是小写字母

思路1:
1、题目不难理解,就是返回字符串数组中 都存在的字符,重复也没关系;
2、刚开始想到的是 使用map,遍历字符串数组,记录每个字符的次数,[字符:次数],如示例1:["bella","label","roller"]

b 1
e 1
l 2
a 1

3、然后比较字典相同字符所对应的value值,取小值
4、然后遍历字典数组,打印字典value值大于0 的 key,然后返回
5、由于Swift API不熟悉 最后没实现 手动哭

思路2:(别人的)
1、创建一个0-26空间的数组;
2、遍历第一个字符串,使每个字符 减去 a的assii值,得到的这个值正好是数组的下标
3、然后遍历剩余字符串,每遍历一个字符串得到一个0-26空间的数组,然后和第一个数组比较,取小值
4、遍历数组,打印数组下标对应的value 大于 0的字符即可

代码实现:

func commonChars(_ A: [String]) -> [String] {
    var result = [String]()
    var arr = Array.init(repeating: 0, count: 26)
    for cha in A[0] {//计算第一个串的c字符下标所对应的数量
        let v = cha.asciiValue! - Character.init("a").asciiValue!
        arr[Int(v)]+=1
    }
    
    for i in 1..<A.count {
        var tmp = Array.init(repeating: 0, count: 26)
        for c in A[i] {
            let vv = c.asciiValue! - Character.init("a").asciiValue!
            tmp[Int(vv)]+=1
        }
        for n in 0...25 {//对比  取最小
            arr[n] = min(arr[n], tmp[n])
        }

    }
    
    for i in 0..<arr.count {//打印 下标大于0 的字符,字符的个数为下标值
        if arr[i] > 0 {
            var index = arr[i]
            while index > 0 {
                let num = Int(Character.init("a").asciiValue!) + i
                let c = Character.init(UnicodeScalar(num)!)
                result.append(String.init(c))
                index-=1
            }
        }
    }
    return result
}
上一篇 下一篇

猜你喜欢

热点阅读