找卧底
- 时间复杂度: 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}));
}
}