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语句进行闰月的判断就完成了。
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;
}
}
这道题考察的是最基础的循环的练习以及String的方法的使用;欢迎大家将自己的解法分享出来,一起学习,共同进步;
给你一个整数 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、方法一: 对于回文判断,我们可以将原数字反转后与原数字进行比较进行判断;
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;
}
}
基础循环考察,继续加油!
给出第一个词 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;
}
}
罗马数字包含以下七种字符: 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();
}
}