1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| package jewelsAndStones;
import java.util.*;
/** * @Auther: 1nfinity * @Description: 先把 stone 中的字符及其个数统计出来并放入 Map 中, 然后在其中寻找对应的 jewel 的数量. 这样应该比直接在 stones 中检索要快 * @Date: Created in 02:53 PM 3/16/2018 * @Modified By: */ public class Solution { public static int numJewelsInStones(String J, String S) { // 获取 Stones 字符串的字符列表 // 仅适用 string.toCharArray 获取到的只是数组, 无法对其进行 remove 操作, 因此需要循环成 List List<Character> chars = new ArrayList(); for (char c : S.toCharArray()) { chars.add(c); } Map<Character, Integer> charsAndNumMap = new HashMap(); // 将 List 的第一个字符和其它字符相比较, 如果相同, 数量+1并删除该字符 // 将上述过程循环进行, 直到 List 的 size 为零, 得到包含 stone 类型和数量的 Map // 由于 chars.size() 一直在变动, 因此不适合以其为边界使用 for(). // for() 并非必须使用, 尽量在有固定边界条件时使用 while (chars.size() > 0) { int count = 1; for (int i = 1; i < chars.size();) { if (chars.get(0) == chars.get(i)) { chars.remove(i); count++; }else { // 只有在第一个字符未匹配到相同字符时才进行 i++, 因为 i++ 不是必须的, 只是为了推动循环向前进行, 当匹配时, 已经对匹配到的字符进行了移除, 减小了 size, 相当于已经进行了 i++, 已经推进了循环. i++; } } charsAndNumMap.put(chars.get(0), count); chars.remove(0); } // 遍历 jewel, 尝试在 Map 中获取其数量, 将所有类型的 jewel 的数量相加 char[] jewels = J.toCharArray(); int jewelNum = 0; for (char jewel : jewels) { if (charsAndNumMap.containsKey(jewel)) { jewelNum += charsAndNumMap.get(jewel); } } System.out.println("stone type: " + charsAndNumMap.keySet()); System.out.println("stone num: " + charsAndNumMap.values()); System.out.println("jewels total num: " + jewelNum); return jewelNum; } public static void main(String[] args) { numJewelsInStones("ngm", "kxga"); } }
|