【每日编程08】拼写单词和一年中的第几天

题目1: 拼写单词

【每日编程08】拼写单词和一年中的第几天
【每日编程08】拼写单词和一年中的第几天

解题思路:
使用哈希表存储chars中每个字母的数量
再使用一个哈希表存储word中每个字母的数量
将这两个哈希表的键值对逐一进行比较

//先来一个比较通俗易懂的代码
class Solution{
    public int countCharacters(String[] words, String chars){
        Map<Character, Integer> charsMap = new HashMap<>();
        int charsLength = chars.length();
        for (int i = 0; i < charsLength; i++){
            char c = chars.charAt(i);
            charsMap.put(c, charsMap.getOrDefault(c, 0) + 1);
        }
        int ans = 0;
        for (String word : words){
            Map<Character, Integer> wordMap = new HashMap<>();
            int wordLength = word.length();
            for (int i = 0; i < wordLength; i++){
                char c = word.charAt(i);
                wordMap.put(c, wordMap.getOrDefault(c, 0) + 1);
            }
            boolean isAns = true;
            for (int i = 0; i < wordLength; ++i){
                char c = word.charAt(i);
                if (charsMap.getOrDefault(c, 0) < wordMap.getOrDefault(c, 0)){
                    isAns = false;
                    break;
                }
            }
            if (isAns){
                ans += word.length();
            }
        }
        return ans;
    }
}
//该代码是以上代码的简写
class Solution {
    public int countCharacters(String[] words, String chars){
        Map<Character, Integer> charsMap = new HashMap<>();
        for(int i = 0; i < chars.length(); i++){
            charsMap.put(chars.charAt(i), charsMap.getOrDefault(chars.charAt(i), 0) + 1);
        }
        int ans = 0;
        for(String word : words){
            Map<Character, Integer> wordMap = new HashMap<>();
            for(int i = 0; i < word.length(); i++){
                wordMap.put(word.charAt(i), wordMap.getOrDefault(word.charAt(i), 0) + 1);
            }
            boolean isAns = true;
            for(int i = 0; i < word.length(); i++){
                if(charsMap.getOrDefault(word.charAt(i), 0) < wordMap.getOrDefault(word.charAt(i), 0)){
                    isAns = false;
                    break;
                }
            }
            if(isAns){
                ans += word.length();
            }
        }
        return ans;
    }
}

以上代码和【每日编程07】有异曲同工之妙, 并且同时运用到了getOrDefault()方法


题目2: 一年中的第几天

【每日编程08】拼写单词和一年中的第几天
【每日编程08】拼写单词和一年中的第几天
【每日编程08】拼写单词和一年中的第几天

解题思路:
1.使用substring根据字符串的特点拆分出年月日
2.判断是否是闰年

闰年: 能整除400或者能整除4却不能整除100

class Solution {
    public int dayOfYear(String date) {
        int year = Integer.parseInt(date.substring(0, 4));
        int month = Integer.parseInt(date.substring(5, 7));
        int day = Integer.parseInt(date.substring(8));
        int[] monthArray = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        if((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)){
            monthArray[1] = 29;
        }
        int sum = 0;
        for(int i = 0; i < month - 1; i++){
            sum += monthArray[i];
        }
        sum += day;
        return sum;
    }
}

Integer.parseInt()作用:

  1. 将()内的String类型字符串转化为int类型
  2. ()内的字符串必须是数字

substring用法:
date = "2022-01-24"
date.substring(0, 4): 从下标为0的位置开始截取到下标为4的位置(不包括下标为4的值), 即结果为"2022";
date.substring(5, 7):从下标为5的位置开始截取到下标为7的位置(不包括下标为7的值), 即结果为"01";
date.substring(8):从下标为8的位置开始截取到最后的值, 即结果为"24"

上一篇:代码随想录刷题-字符串


下一篇:面试题19. 正则表达式匹配