经典面试题 (一) 猫午睡问题 Kaki的博客

本文探讨了两只猫按特定规律更换午睡位置的问题,并通过一个Java程序实现了计算猫B在第k小时开始时的位置。考虑到猫A和猫B之间存在等级制度,程序需确保两者不会在同一位置午睡。

经典面试题 (一) 猫午睡问题    Kaki的博客

问题描述:
       假设两只猫住在一起,都喜欢睡觉,它们每小时都会循环地更换午睡的地方。

现在给定 n 个可以睡觉的位置:

➢ 猫 A 按顺序更换它的午睡地: , 1, 2, ,3,2,1, , 1, n n n n n − − − ,换句话 说,在第 1 个小时里,它在 n 的位置上,然后按顺序循环递减。

➢ 猫 B 按顺序改变它的午睡地点: 1,2,3, , 1, ,1,2, n n − ,换句话说,在

       第 1 个小时里,它在 1 的位置上,然后以循环的方式递增。 猫 B 比猫 A 要年轻得多,所以它们有严格的等级制度。A 和 B 不能同时在一 个位置上睡觉。换句话说,当某个小时的开始时刻,如果两只猫将要去睡觉的位 置相同(例如 x 号位置),那么 A 将会占用这个位置睡觉,而 B 必须按它的顺序 挪到下一个位置去睡觉(如果 x>n,就到 x+1,但如果 x=n,就到 1)。

       试计算一下,猫 B 在第 k 小时的开始时刻将占用哪个位置睡觉?

⚫要求:

完成题目对应的程序模板(CatSleeping)中的方法:
       int findPosition(int n, int k);
       该方法的入口参数 n 为两个猫睡觉的位置总数,参数 k 为第 k 小时的开始 时刻; 最后输出结果为猫 B 在第 k 小时的开始时刻所能占用的位置 提示         • 2 <= n <= 10(9次幂)
        • 1 <= k <= 10(9次幂)

⚫ 样例:

     ◼ 样例 1      输入:n = 4, k = 2      输出:2

     解释:第 1 个小时的开始时刻,猫 B 移到位置 1 睡觉,第 2 个小时的开
始时刻,按照顺序,猫 B 将移到位置 2 睡觉,所以输出结果为 2

     ◼ 样例 2
     输入:n = 3, k = 2
     输出:3
     解释:第 2 个小时的开始时刻,猫 A 和猫 B 都来到了位置 2,按照等级,猫 B 必须让出位置 2,前往位置 3 睡觉,所以输出结果为 3

解答:

package com.kaki.test;

/**
 * @author Kaki Nakajima
 * @date   2020-05-15
 * @desc   猫午睡问题
 */
public class CatSleeping {

    /**
     * 猫午睡问题
     * @param n 可移动的睡觉位置
     * @param k 几个小时时间内
     * @return 最后输出结果为猫 B 在第 k 小时的开始时刻所能占用的位置
     */
    public static int findPosition(int n, int k){

        //分析1: 猫A 递减,猫B 递增
        //分析2: 当睡觉位置有交集时,猫A 跳到下一个位置

        //猫B 移动统计
        int maoBCount = 0;

        int maoAPosition = n; //猫A 位置
        int maoBPosition = 1; //猫B 位置

        //循环(时间)
        for (int i=k; k >0 ; k--) {


            maoBCount ++;
            maoAPosition --;//猫A 递减
            maoBPosition ++;//猫B 递增

            //循环位置
            if(maoAPosition == 1){
                maoAPosition = n;
            }

            if(maoBPosition >=n){
                maoBPosition = 1;
            }

            //交集的情况 (当睡觉位置有交集时,猫A 跳到下一个位置)
            if(maoAPosition == maoBPosition){
                maoBCount++;
                maoAPosition --;
            }

        }

        return maoBCount;
    }

    public static void main(String[] args) {
        //n = 4, k = 2...  n = 3, k = 2
        System.out.println(findPosition(3,8));
    }
}

此处方法只是实现之一,如有更高效的方法可以在评论区留言哈~

码云地址直通车

欢迎码云,B站,ins 关注Kaki Nakajima

要在VMware虚拟机上安装Kali Linux,您可以按照以下步骤进行操作: 1. 首先,确保您已经在VMware Workstation中创建了一个新的虚拟机并完成了基本设置。 2. 然后,在安装Kali Linux之前,您需要准备Kali Linux的ISO映像文件。您可以从官方网站下载最新版本的Kali Linux,并将其保存到您的计算机上的合适位置。 3. 打开VMware Workstation,并选择您已创建的虚拟机。 4. 在虚拟机设置中,添加一个CD/DVD硬件,并将ISO映像文件的路径设置为之前下载的Kali Linux ISO文件的位置。 5. 启动虚拟机,它将从Kali Linux的ISO映像文件启动。 6. 在虚拟机中,按照安装向导的指示进行Kali Linux的安装。您可以选择安装位置、分区设置其他选项。 7. 完成安装后,虚拟机将重新启动,并您将能够进入全新安装的Kali Linux系统。 请注意,安装Kali Linux时,您可能需要对虚拟机的些设置进行调整,例如内存、处理器网络设置,以确保虚拟机的性能功能满足您的需求。 另外,安装VMware Tools是一个可选的步骤,它可以提供更好的虚拟机性能功能。您可以通过在虚拟机中选择菜单中的“安装VMware Tools”选项来安装VMware Tools。然后,您可以按照向导的指示进行安装,并根据需要进行设置。 总结: 1. 准备Kali Linux的ISO映像文件并将其保存到计算机上。 2. 在VMware Workstation中创建新的虚拟机并进行基本设置。 3. 在虚拟机设置中,添加CD/DVD硬件并将ISO映像文件路径设置为Kali Linux ISO文件的位置。 4. 启动虚拟机,并按照Kali Linux的安装向导进行安装。 5. 完成安装后,重新启动虚拟机,并进入新安装的Kali Linux系统。 请根据您的具体需求境进行相应的调整配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KakiNakajima

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值