题目链接:
题目描述:
输入两个表示复数的字符串,输出它们相乘的结果的字符串
复数字符串用a+bi表示(a, b 为整数, i为虚数单位,i2=-1)
输入描述:
两个表示复数的字符串
输出描述:
输出a + bi形式的正确结果
示例1:
输入:
1+2i
2+1
输出:
0+5i
例子说明:
(1+2i)(2+i) = (2 + i + 4i + 2i * i) = 0 + 5i
示例2:
输入:
1+ -2i
3+4i
输出:
11+ -2i
例子说明:
(1+ -2i)(3+4i) = (3 + 4i - 6i - 8i * i) = 11+ -2i
个人总结:
写两个函数分别获取字符串的实部和虚部,然后根据计算规则计算出答案的实部和虚部,最后拼接字符串即可。
代码实现:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s1 = sc.nextLine();
String s2 = sc.nextLine();
int real1 = getReal(s1);
int image1 = getImage(s1);
int real2 = getReal(s2);
int image2 = getImage(s2);
int real = real1 * real2 - image1 * image2;
int image = real1 * image2 + real2 * image1;
System.out.println(real + "+" + image + "i");
}
//实部也可能有负数 但是不写也过了 所以我就没改了 测试用例好像没这个
public static int getReal(String s) {
int res = 0;
int idx = 0;
while (s.charAt(idx) != '+') {
res = res * 10 + s.charAt(idx++) - '0';
}
return res;
}
public static int getImage(String s) {
int res = 0;
int i = 0;
while (s.charAt(i) != '+') {
i++;
}
// i 下标对应 +
i++;
int flag = 1;
for (; i < s.length(); i++) {
char c = s.charAt(i);
if (c == 'i') {
break;
} else if (c == '-') {
flag = -1;
} else {
res = res * 10 + c - '0';
}
}
return flag * res;
}
}
题目描述:
输入一个"YYYY-MM-dd"格式的日期字符串,输出该天是当年的第几天(1 月 1 日是每年的第 1 天)
输入描述:
一个"YYYY-MM-dd"格式的表示日期的字符串
输出描述:
该天是当年的第几天
示例1:
输入:
2019-01-09
输出:
9
示例2:
输入:
2004-03-01
输出:
61
个人总结:
个人没想到的地方,在判断是闰年的语句里面,需要加一个判断月份是否大于二,如果不大于,则不进入if语句内部。
代码实现:
import java.util.*;
public class Main {
static int[] count = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
int yy = Integer.parseInt(s.substring(0, 4));
int mm = Integer.parseInt(s.substring(5, 7));
int dd = Integer.parseInt(s.substring(8));
int ans = count[mm - 1] + dd;
if (isLeapYear(yy) && mm >= 2) {
ans += 1;
}
System.out.println(ans);
}
public static boolean isLeapYear(int year) {
if (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0)) {
return true;
}
return false;
}
}
题目描述:
给你一个链表,每 k 个节点一组进行翻转,请返回翻转后的链表。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例 :
给定这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
输入描述:
第一行:依次输入链表中的各个元素,以"#"结束
第二行:每组数量k
输出描述:
处理后的链表中的各个元素,以"->"连接
示例1:
输入:
1 2 3 4 5 #
2
输出:
2->1->4->3->5
示例2:
输入:
1 2 3 4 5 #
3
输出:
3->2->1->4->5
个人思路:
个人没想到的地方是我直接将字符串转换成字符数组了,然后没注意到每个数字字符之间的空格,等于空格字符直接被我无视了,然后写着出了点问题。
代码实现:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
int k = sc.nextInt();
String[] ss = s.split(" ");
int len = 1;
int end = 0;
for (int i = 0; i < ss.length - 1; i++) {
//len != k
if (len != k) {
len++;
} else {
//len == k
reverse(ss, end, i);
end = i + 1;
len = 1;
}
}
//输出
for (int i = 0; i < ss.length - 1; i++) {
if (i != ss.length - 2) {
System.out.print(ss[i] + "->");
} else {
System.out.print(ss[i]);
}
}
}
public static void reverse(String[] ss, int left, int right) {
while (left < right) {
String s = ss[left];
ss[left] = ss[right];
ss[right] = s;
left++;
right--;
}
}
}