这是悦乐书的第 313 次更新, 第 334 篇原创
01 看题和准备
今天介绍的是 LeetCode 算法题中 Easy 级别的第 182 题 (顺位题号是 771). 字符串 J 代表珠宝, S 代表你拥有的石头. S 中的每个字符都是你拥有的一种石头. 计算 S 中有多少石头也是珠宝. J 中的字符不会重复出现, J 和 S 中的所有字符都是英文字母. 字母区分大小写, 因此 "a" 被认为是与 "A" 不同类型的石头. 例如:
输入: J ="aA",S ="aAAbbbb"
输出: 3
输入: J ="z",S ="ZZ"
输出: 0
注意:
S 和 J 将由字母组成, 长度最多为 50.
J 中的字符不会重复出现.
本次解题使用的开发工具是 eclipse,jdk 使用的版本是 1.8, 环境是 win7 64 位系统, 使用 Java 语言编写和测试.
02 第一种解法
题目的意思是计算出 J 中的每个字符, 在 S 中出现的次数之和. 因为 J 中的字符不会有重复值, 所以可以直接计算, 不用担心计算失真. 因为是英文字母, 所以可以直接使用整型数组, 以 S 中每个字符代表的 ASCII 值来作为索引, 出现次数为值, 然后遍历该数组, 再以 J 的每个字符作为索引, 累加对应的元素值即可.
- public int numJewelsInStones(String J, String S) {
- int[] arr = new int[128];
- for (char ch : S.toCharArray()) {
- arr[ch]++;
- }
- int count = 0;
- for (char ch : J.toCharArray()) {
- count += arr[ch];
- }
- return count;
- }
03 第二种解法
也可以只使用一个循环来解决, 借助字符串的 indexOf 方法, 每次获取 S 中的一个字符, 来判断是否存在于 J 中, 存在就次数加 1.
- public int numJewelsInStones(String J, String S) {
- int count = 0;
- for (int i=0; i<S.length(); i++) {
- if (J.indexOf(S.charAt(i))> -1) {
- count++;
- }
- }
- return count;
- }
04 小结
算法专题目前已日更超过五个月, 算法题文章 182 + 篇, 公众号对话框回复 [数据结构与算法] ,[算法] ,[数据结构] 中的任一关键词, 获取系列文章合集.
以上就是全部内容, 如果大家有什么好的解法思路, 建议或者其他问题, 可以下方留言交流, 点赞, 留言, 转发就是对我最大的回报和支持!
来源: http://www.jianshu.com/p/841959253b25