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

5 篇文章 0 订阅

经典面试题 (一) 猫午睡问题    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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

KakiNakajima

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

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

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

打赏作者

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

抵扣说明:

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

余额充值