2020 美团笔试 - 回顾三道算法题

目录

题目一

解题思路

参考解题

题目二

解题思路

参考解题

题目三

解题思路

参考解题 



题目一

输入当前周几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,不一天修完,按照如下格式修

天数1234 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);
		}
		
	}
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值