感觉这道题可以用置换的思维,让num[i]存放值为i+1的数字。遍历数组,如果num[i] == i+1,令i++查看下一个num[i]。如果num[i] != i+1,则看num[num[i] - 1]是否等于num[i],如果不同则两者交换,让num[i]到正确的位置,同时判断新的num[i] 是否等于 i+1,重复过程;如果num[num[i] - 1]等于num[i],则说明num[i]出现了两次,令i++查看下一个num[i]。
这样一趟下来,出现一次的数都到了正确的位置(值为i+1的数字回到了num[i])。再次遍历,其余num[i]!=i+1的数字就是出现两次的数字。这个方法时间复杂度为O(n),空间复杂度为O(1)。