【力扣刷题总结】

每日一练

  • 1.1154. 一年中的第几天
    • 1.1题目与思路分析
    • 1.2代码实现
    • 1.3总结
  • 2.回文数
    • 2.1题目与分析
    • 2.2代码实现
    • 2.3总结:
  • 3.1078. Bigram 分词
    • 3.1题目与分析
    • 代码实现
  • 4.12. 整数转罗马数字
    • 题目及分析

1.1154. 一年中的第几天

1.1题目与思路分析

1154. 一年中的第几天

给你一个字符串 date ,按 YYYY-MM-DD 格式表示一个 现行公元纪年法 日期。请你计算并返回该日期是当年的第几天。
通常情况下,我们认为 1 月 1 日是每年的第 1 天,1 月 2 日是每年的第 2 天,依此类推。每个月的天数与现行公元纪年法(格里高利历)一致。

示例 1:
输入:date = “2019-01-09”
输出:9
示例 2:
输入:date = “2019-02-10”
输出:41
示例 3:
输入:date = “2003-03-01”
输出:60
示例 4:
输入:date = “2004-03-01”
输出:61

提示:

date.length == 10
date[4] == date[7] == '-',其他的 date[i] 都是数字
date 表示的范围从 1900 年 1 月 1 日至 2019 年 12 月 31 日

分析:题目要求我们根据所给年月日统计当前这一天是一年中的第几天;所以我们先要找到一年中12个月每一个月中天数的特点;1,,3,5,7,8,10,12是31天,4,6,9,11是30天,2月分为闰月是29天,平常为28天。搞清楚这个我们就可以将所给日期的字符串使用substring()获取到所需要的年月日字符串,再通过Integer.parseInt()强转就可以得到数字;我们使用for循环,在里面利用switch case 语句进行天数的计算,当为2月时再加一个if语句进行闰月的判断就完成了。

1.2代码实现

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 days = 0;
         for(int i = 1;i<month;i++){
             switch(i){
                 case 1:
                 case 3:
                 case 5:
                 case 7:
                 case 8:
                 case 10:
                 case 12: days += 31;
                 break;
                 case 4:
                 case 6:
                 case 9:
                 case 11: days += 30;
                 break;
                 case 2: 
                    if((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)){
                        days += 29;
                    }else{
                        days += 28;
                    } 
                    break;
                 default:
                 break;
             }
         }
         days = days + day;
         return days;
    }
}

【力扣刷题总结】_第1张图片

1.3总结

这道题考察的是最基础的循环的练习以及String的方法的使用;欢迎大家将自己的解法分享出来,一起学习,共同进步;

2.回文数

2.1题目与分析

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。
示例 1:
输入:x = 121
输出:true
示例 2:
输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。
示例 4:
输入:x = -101
输出:false

分析:所谓回文数就是从后往前,和从前往后排列是一模一样的;他和我们的回文诗一样;根据题意给我们的是一个整数,那么有整数,有负数;
1、我们先将不符合回文的数排除掉:首先负数肯定不是回文数,再有正数中个位是0的也不是回文数;
2、方法一: 对于回文判断,我们可以将原数字反转后与原数字进行比较进行判断;

2.2代码实现

class Solution {
    public boolean isPalindrome(int x) {
        if((x % 10 ==0&& x != 0)|| x < 0){
            return false;
        }
        int temp = x;
        int number = 0;
        while(x > 0){
            number = number * 10 + x % 10;
            x /= 10;
        }
        return number == temp;
    }
}

方法二: 因为是回文,如果数字的位数是偶数,则进行前一半与后一半的比较即可,如果是奇数位,将中数前后的两半进行比较即可;

class Solution {
    public boolean isPalindrome(int x) {
        if((x % 10 ==0&& x != 0)|| x < 0){
            return false;
        }
        int reverNum = 0;
        //我们这里是判断后一半值比前一半值大时结束循环,如12321;循环结束时后一半值为123;
        
        while(x > reverNum){
            reverNum = reverNum * 10 + x % 10;
            x /= 10;
        }
        //而我们想要的是12;所以将它对10进行整除;拿到结果值;
        return x == reverNum || x == reverNum / 10;
    }
}

2.3总结:

基础循环考察,继续加油!

3.1078. Bigram 分词

3.1题目与分析

给出第一个词 first 和第二个词 second,考虑在某些文本 text 中可能以 “first second third” 形式出现的情况,其中 second 紧随 first 出现,third 紧随 second 出现。

对于每种这样的情况,将第三个词 “third” 添加到答案中,并返回答案。

示例 1:

输入:text = “alice is a good girl she is a good student”, first = “a”, second = “good”
输出:[“girl”,“student”]

示例 2:

输入:text = “we will we will rock you”, first = “we”, second = “will”
输出:[“we”,“rock”]

提示:

1 <= text.length <= 1000
text 由小写英文字母和空格组成
text 中的所有单词之间都由 单个空格字符 分隔
1 <= first.length, second.length <= 10
first 和 second 由小写英文字母组成

分析:根据题目我们通过循环遍历只要前两个单词符合first,second,那我们将它放入数组;题目给的是长的字符串,是按空格进行划分的,所以使用String的split()方法将其分成字符串数组;再按循环拿即可;

代码实现

class Solution {
    public String[] findOcurrences(String text, String first, String second) {
        String[] words = text.split(" ");
        List<String> list = new ArrayList<String>();
        /*for(int i = 2;i< words.length;i++){
            if(words[i - 2].equals(first) && words[i - 1].equals(second)){
                list.add(words[i]);
            }
        }*/
        for(int i = 0;i<words.length - 2;i++){
            if(words[i].equals(first) && words[i+1].equals(second)){
                list.add(words[i+2]);
            }
        }
        String[] ret = new String[list.size()];
        for(int i = 0;i<ret.length;i++){
            ret[i] = list.get(i);
        }
        return ret;
    }
}

【力扣刷题总结】_第2张图片

4.12. 整数转罗马数字

题目及分析

  1. 整数转罗马数字

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000

例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

给你一个整数,将其转为罗马数字。

示例 1:
输入: num = 3
输出: “III”
示例 2:
输入: num = 4
输出: “IV”
示例 3:
输入: num = 9
输出: “IX”
示例 4:
输入: num = 58
输出: “LVIII”
解释: L = 50, V = 5, III = 3.
示例 5:
输入: num = 1994
输出: “MCMXCIV”
解释: M = 1000, CM = 900, XC = 90, IV = 4.
提示: 1 <= num <= 3999

我们按照要求将阿拉伯数字对应的古罗马数字对应起来,主要的有:
1000,900,500,400,100,90,50,40,10,9,5,4,1
“M”,“CM”,“D”,“CD”,“C”,“XC”,“L”,“XL”,“X”,“IX”,“V”,“IV”,“I”;所以我们有了这些,其他都是有规律的;II表示2,III表示3,VI表示6,VII表示7,VIII表示八;依次类推;
所以我们可以定义两个数组,一个数组存储阿拉伯数字,一个存储古罗马数字字符串,通过循环拿到同一个下标的阿拉伯数字与古罗马数字;若是给的数字大于当前下标对应的值,让num 减去该下标的值,使用字符串拼接该下标的古罗马数字;直到num=0;返回该字符串即可;

class Solution {
    public String intToRoman(int num) {
        int[] values = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
        String[] strs = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
        StringBuffer stringBuffer = new StringBuffer();
        for(int i = 0;i<values.length;i++){
            int value = values[i];
            String str = strs[i];
            while(num >= value){
                num -= value;
                stringBuffer.append(str);
            }
            if(num == 0){
                break;
            }
        }
        return stringBuffer.toString();
    }
}

你可能感兴趣的:(Java,练习题,力扣,leetcode,算法)