theme: smartblue
持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
找出游戏的获胜者
题目太长,示例没有截全。
题目解析
题目素材解析
根据本题目的描述,还有题目给的代码模板。
一共提供了两个素材。
数字n。
数字k。
并且规定1 <= k <= n <= 500。
我的解读
本道题题目特别长,读起来很费劲。
简明扼要的说一下。
数字n代表着n个位置;k代表着每次跳跃或者说每次运动的位置点数。
假设一个人在n个位置中,经过多次的按顺序跳跃,每次跳跃都视为移动k个位置点。
这个人每一次跳跃后,所在的位置都要被消除掉;多次跳跃后,只保留最后一个位置点。
最后这个位置点就是我们的预期结果值。
解题思路
来说一下我的解题思路吧。
第一步,先来排除一个特殊情况就是位置n等于1的时候,我一次提交失败就是因为这个特殊情况没有处理。
第二步,声明集合变量set,用于存放已经消除的值;位置点位i。
第三步,开始一级循环,一级循环体内,通过二级循环来跳跃位置点得到需要消除的点位;判断是否只剩下一个值。
第四步,二级循环体内,通过判断下一个点位是否被消除来确定是不是再移动一个点位。
等待循环结束,就能得到预期结果了,虽然笨点,但是还是比较清晰的。
代码
```java class Solution { public int findTheWinner(int n, int k) { if(n == 1){ return 1; } Set set = new HashSet<>(); int i = 0; while (true){ for (int j = 0; j < k; j++) { if(n < ++i){ i = i - n; } if(set.contains(i)){ while(set.contains(i)){ if(n < ++i){ i = i - n; } } } } set.add(i); if(set.size() == n - 1){ break; } } int result = 1; for (int j = 1; j <= n; j++) { if(!set.contains(j)){ result = j; } } return result; }
} ```
执行结果
明显是不理解的方案,这次的题目完全就是笨方法,但凡用一点巧劲也不至于这么惨。
试了试官方提供的题解,速度上差了好多,但是排名靠前的题解排名都不怎么高。。。。
Java代码本地执行
Java本地可调试代码,请参考github/Ijiran,可通过索引看到相应代码。