目录
题目一
输入当前周几x,当前时间(24小时制,时、分不够两位数的前面补0),一个分钟数n;
输出:当前时间往前推n分钟的时间,即周几 + 24制时间 。
输入:
3
02:10
200
输出:
2
23:40
解题思路
对于24进制的时间: 天(0~7): 时(0~24):分(0~60)
则对应一个分钟数n,有以下规律,时间常用规律,挺有意思的:
- 对应的天数为 :n/(24 * 60)
- 对应的时数为:n%(24 * 60)/60
- 对应的分数:n%(24 * 60)%60
参考解题
恕我直言,用scanner类的考试网站真是太烦了
package Sword;
import java.util.Scanner;
public class Time {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int day = sc.nextInt();
String time = sc.next();
int extraMinute = sc.nextInt();
String[] strings = time.split(":");
int hour = Integer.parseInt(strings[0]);
int minute = Integer.parseInt(strings[1]);
int extraDay = extraMinute / (60 * 24);
int extraHour = extraMinute % (60 * 24) / 60;
extraMinute = extraMinute % (60 * 24) % 60;
int nowMinute = minute - extraMinute;
if (nowMinute < 0) {
nowMinute += 60;
hour--;
}
int nowHour = hour-extraHour;
if (nowHour < 0) {
nowHour += 24;
day--;
}
int nowDay = day - extraDay;
while(nowDay <= 0) {
nowDay += 7;
}
System.out.println(nowDay);
if(nowHour<10){
System.out.print("0"+nowHour);
}else{
System.out.print(nowHour);
}
System.out.print(":");
if(nowMinute<10){
System.out.print("0"+nowMinute);
}else{
System.out.print(nowMinute);
}
}
}
题目二
超越问题,输入n个人,第二行输入n个人的出发顺序,第三行输入n个人的到达顺序,输出后出发但是先到达的总次数。
示例输入:
5
5 4 3 2 1
2 5 4 3 5
解题思路
将出发循序和到达顺序关联起来,使用键值对,hashMap;
然后将出发顺序排序,遍历第i个出发的人,在第i+1、i+2、i+3、……n个出发的人中看是否有比第i个人先到的。
时间复杂度:o(n^2)
参考解题
这道题运行超时了,应该还需要更省时间的做法
package Sword;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner scn = new Scanner(System.in);
int num = scn.nextInt();
int[] order = new int[2*num];
while (scn.hasNextInt()) {
for (int i = 0; i < 2*num; i++) {
order[i] = scn.nextInt();
}
}
int[] startOrder = new int[num];
for (int i = 0; i < num; i++) {
startOrder[i] = order[i];
}
int[] arriveOrder = new int[num];
for (int i = 0; i < num; i++) {
arriveOrder[i] = order[i + num];
}
HashMap<Integer, Integer> startToarrive = new HashMap<>();
for (int i = 0; i < num; i++) {
startToarrive.put(startOrder[i], arriveOrder[i]);
}
int count = 0;
// 排序
Arrays.sort(startOrder);
for (int i = 0; i < num; i++) {
for (int j = i + 1; j < num; j++) {
if (startToarrive.get(startOrder[j]) < startToarrive.get(startOrder[i])) {
++count;
}
}
}
System.out.println(count);
}
}
题目三
修复bug,共有n个bug,不一天修完,按照如下格式修
天数 | 1 | 2 | 3 | 4 | i | ||
修的bug | [x] | [x/k] | [x/k^2] | [x/k^3] | [x/k^(i-1)] |
输入:n k
输出:x至少为多少,满足以上格式刚好修完bug
示例:
输入:10 3
输出:8
解题思路
x范围至少为1,至多为n;
利用双指针 + 二分查找,在x范围内取mid,计算求和与n比较,然后利用二分法思路。
参考解题
注意:临时变量就近定义,方便更新;而且为了避免前后临时变量混淆,在需要临时变量的地方都要定义一个新的临时变量。这个不注意有时候挺坑的!
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
int x = 1;
int left = 1;
int right = n;
while (left < right-1) {
x = (left + right) / 2;
int k0 = 1;
int sum = 0;
while (x/k0 != 0) {
sum += (int) Math.floor(x / k0);
k0 *= k;
}
if (sum < n) {
left = x ;
}else if(sum >= n){
right = x ;
}
}
x = left;
int k0 = 1;
int sum = 0;
while (x/k0 != 0) {
sum += (int) Math.floor(x / k0);
k0 *= k;
}
if(sum >= n){
System.out.println(x);
}else {
System.out.println(x+1);
}
}
}