数组中只出现一次的数字
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字,要求时间复杂度是O(n),空间复杂度是O(1)。
任何一个数字异或它自己都是0。如果我们从头到尾异或数组中的每一个数字,那么最终的结果刚好是那个只出现一次的数字,因为那些成对出现两次的数字全部在异或中抵消了。
#include <iostream> unsigned int FindFirstBitIs1( int num ) { int indexBit = 0; while ( ( ( num & 1 ) == 0 ) && ( indexBit < 8 * sizeof( int ) ) ) { num = num >> 1; indexBit++; } return indexBit; } bool IsBit1( int num, const unsigned int indexBit ) { num = num >> indexBit; return ( num & 1); } void FindNumberAppearOnce( int *data, int length, int &data1, int &data2 ) { if ( data == NULL || length < 2 ) { return; } int orResult = 0; for ( int i = 0; i < length; ++i ) { orResult = orResult ^ data[ i ]; } unsigned int firstBitIs1 = FindFirstBitIs1( orResult ); data1 = data2 = 0; for ( int i = 0; i < length; ++i ) { if ( IsBit1( data[ i ], firstBitIs1 ) ) { data1 ^= data[ i ]; } else { data2 ^= data[ i ]; } } } int main() { int data[] = {2, 4, 3, 6, 3, 2, 5, 5}; int data1, data2; FindNumberAppearOnce( data, 8, data1, data2 ); std::cout << "Only appear once num is " << data1 << " and " << data2 << std::endl; return 0; }
数值的整数次方
实现函数 double Power(double base, int exponent),求base的exponent次方
1 #include <iostream> 2 3 bool g_Invalid = false; 4 5 bool Equal( double arg1, double arg2 ) 6 { 7 if ( (arg1 - arg2 >= -0.0000001 ) && ( arg1 - arg2 <= 0.0000001 ) ) 8 { 9 return true; 10 } 11 return false; 12 } 13 14 double PowerWithUnsignedExponent( double base, unsigned int exponent ) 15 { 16 double result = 1.0; 17 double tmpRet = base; 18 while ( exponent ) 19 { 20 if ( exponent & 1 ) 21 { 22 result *= tmpRet; 23 } 24 tmpRet *= tmpRet; 25 exponent >>= 1; 26 } 27 return result; 28 } 29 30 double Power( double base, int exponent ) 31 { 32 if ( Equal( base, 0.0 ) && exponent < 0 ) 33 { 34 g_Invalid = true; 35 return 0.0; 36 } 37 38 double result = PowerWithUnsignedExponent( base, (unsigned int)( exponent > 0 ? exponent : -exponent ) ); 39 if ( exponent < 0 ) 40 { 41 result = 1.0 / result; 42 } 43 return result; 44 } 45 46 int main() 47 { 48 double ret1 = Power( 2.0, 10); 49 double ret2 = Power( 2.0, -2); 50 double ret3 = Power( 2.0, 0); 51 double ret4 = Power( 0.0, -1); 52 53 return 0; 54 }
如果输入的指数exponent为32,我们的目标是求出一个数字的32次方,如果我们已经知道了它的16次方,那么只要在16次方的基础上再平方一次就可以了。而16次方是8次方的平方。这样依次类推,我们求32次方只需要做5次乘法:先求平方,在平方的基础上求4次方,在4次方的基础上求8次方,在8次方的基础上求16次方,最后在16次方的基础上求32次方。