找卧底
找卧底
https://ac.nowcoder.com/acm/contest/6383/A
找卧底
- 时间复杂度: o(n)
- 空间复杂度: o(1)
- 思路: 题目会给出一个乱序的数组,我们可以尝试将其恢复。我们假设牛牛的数在有序数组中排在第一个位置,即a[0](牛牛这么牛,当然要排在最前面),然后其他的数依次递增排列,即n排在a[n]。则当我们拿到打乱顺序后的数组后,我们可以取出a[0],假设此时a[0]=p,则可知这个数原先所在位置为a[p],我们取出a[p],比较a[p]是否等于p,如果不是我们将a[0]和a[p]的值互换重复操作,如果是则说明牛牛所代表的数就是p,卧底找到了。
- 代码实现
package nowcoder.pinnacle.s1.match3.gold; /** * 找卧底 * @Author: nayix * @Date: 7/21/20 10:58 AM */ public class ProblemA { /** * * @param n int整型 * @param a int整型一维数组 * @return int整型 */ public int search (int n, int[] a) { while (a[a[0]] != a[0]) { int p = a[0]; a[0] = a[p]; a[p] = p; } return a[0]; } public static void main(String[] args) { ProblemA problemA = new ProblemA(); System.out.println(problemA.search(4, new int[]{1, 2, 1, 4, 3})); } }