[每日两题系列]刷算法题咯~~

        本系列所选题目均来自力扣或者牛客网站. 所选题目主要是以其中的简单题为主, 中等题为辅, 包含少数困难题(原因是: 本人目前能力还不够~ ). 开展这个系列的目的是督促自己, 在暑假的时间里也要保持有一定的刷题量, 拒绝摆烂~
        话不多说, 直接开刷~~

拼写单词

        题目描述: 给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。
        假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。
        注意:每次拼写(指拼写词汇表中的一个单词)时,chars 中的每个字母都只能用一次。
        返回词汇表 words 中你掌握的所有单词的 长度之和。

解题思路:
        (1) 这道题可以直接使用哈希表来操作效率会比较高, 但是会浪费一定的空间.
        (2) 我们先使用哈希表将字符串char里面的字符都存起来, 然后遍历words数组, 因为数组里的每个元素都是字符串类型, 所以我们就可以遍历这个字符串中的每一个字符, 看看对应的哈希表中这个字符里面存的是否是大于0的数, 如若是则减减一下; 如若不大于0(等于0), 那么直接就可以判断char中的字符不能拼成这个单词.
        (3) 最后将这些符合的数组元素长度累加起来, 就是最后想要求的值. 但是这里要注意: 其实这种使用哈希的做法也并不会是很快的, 因为在后面需要使用两次for循环, 时间复杂度还是比较大的. 可能还会有其他办法来解决,下来可以自己想想(本人能力有限, 只能想到这种办法~~).

实现代码:

class Solution {
    public int countCharacters(String[] words, String chars) {
        int[] array=new int[26];
        int[] brrby=new int[26];
        int charslen=chars.length();
        for(int i=0;i<charslen;i++){
            char ch=chars.charAt(i);
            array[ch-97]++;
        }
        int sum=0;
        int wordslen=words.length;
        for(int i=0;i<wordslen;i++){
            brrby=Arrays.copyOf(array,26);
            int wordlen=words[i].length();
            boolean flag=true;
            for(int j=0;j<wordlen;j++){
                char ch=words[i].charAt(j);
                if(brrby[ch-97]==0){
                    flag=false;
                    break;
                }
                brrby[ch-97]--;
            }
            if(flag==true){
                sum+=wordlen;
            }
        }
        return sum;
    }
}

一年中的第几天

        题目描述: 给你一个字符串 date ,按 YYYY-MM-DD 格式表示一个 现行公元纪年法 日期。返回该日期是当年的第几天。

解题思路:
        (1) 这种类型的题目算是非常常见的, 掌握这道题的方法, 基本所有类似的提就迎刃而解了.
        (2) 由于它所给出的是一个字符串, 这时候, 我们就可以使用字符串转整数的方法 — 先使用substring方法拆分字符串, 再使用parseInt方法或者是valueOf方法来进行字符串转整型即可得出字符串中年月日的信息.
        (3) 使用数组来存储每个月对应的天数, 中间需要判断2月对应的天数是否是闰年.
        (4) 最后通过输入的月份, 从头开始累加每个月的天数, 直到上一个月, 在加上所输入的X日, 得出的结果就是最终一年中的第几天.

实现代码:

class Solution {
    public int dayOfYear(String date) {
        int num=0;
        int year = Integer.parseInt(date.substring(0, 4));
        int month = Integer.parseInt(date.substring(5, 7));
        int day = Integer.parseInt(date.substring(8));
        int[] amount = {31,28,31,30,31,30,31,31,30,31,30,31};
        if (year%400==0||(year%4==0&&year%100!=0)) {
            amount[1]++;
        }
        for(int i=0;i<month-1;i++){
            num+=amount[i];
        }
        return num+day;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蔡欣致

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值