使用O(N)的时间复杂度,O(1)的空间复杂度。使用位运算来解决。
首先异或运算如果两个数相同,则异或为0。因此在nums后面加上从1-N的数,然后做异或运算,得到x=x1^x2,x1,x2就是消失的两个数。使x&-x,负数的二进制表示就是符号位不变,正数的反码加1,这样就得到最低的那位1(lsb),出现这位1,就是x1和x2其中一个这l位为1,另一个这l位为0。根据此可以把1-N个数分为两类,一类的l位为1,一类的l位为0。
这样也能把nums的数分为两类。一类中如果把1-n和nums加上,消失的l位为1的数出现一次,其他数出现两次。二类中如果把1-n和nums加上,消失的l位为0的数出现一次,其他数出现两次。因此通过异或两类数就能最终得到消失的两个数。
设定type1和type2初始值为0。先判断lsb和nums[i]相与的结果,如果为1,则将type1和nums[i]异或,如果为0,则将type2和nums[i]异或。然后再将type1,type2再通过以上判断与1-n异或。
今天的小问题
还是老师的idea项目在我的电脑上跑出现了问题。
Internal error (java.lang.UnsupportedClassVersionError): org/xblackcat/frozenidea/jps/ModelSerializerExtension has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
这是因为老师用高版本编译过了,保存在idea的内存中。我的电脑跑的时候用的是高版本编译的文件,与本地的版本冲突。解决方法是把.idea删掉,再重新打开,然后自己重新配置环境。