记得一些奇妙的小算法,代码不多,思路倒是很奇特,有的就是一些小的笔试题,特此记录一下:
1. 不用中间变量,如何交换两个变量的值?
解决:这就要用到异或运算符了(并且这种方式不用考虑溢出哦)。
a = a^b;
b = a^b;
a = a ^b;
2. 能够解决异常安全性的字符串赋值操作(C++)
CMySring& CMyString::operator =(const CMyString &str){
if(*this != str){
CMyString strTemp(str);
char *pTemp = strTemp.m_pData;
strTemp.m_pData = m_pData;
m_pData = pTempl
}
return *this;
}
这样写可以写可以防止在CMyString的拷贝构造函数构造strTemp的时候当内存不足的时候抛出异常,不会过早的改掉当前对象的m_pData,从而影响当前对象的不安全性;还有一点strTemp对象是一个局部对象,在脱离if的作用域时,会自动调用它的析构函数,来清理掉旧的对象用来保存数据的内存,和一些智能指针的实现类似。
3. 计算一个整数的二进制中有多少个1
思路是:你将一个整数换算成二进制后,减去1后,它的第一个为1的位会变为0,改位的右方低位都会变为1,而该位的左方高位不变,在和它本身做与运算之后,从该位开始到所有的低位都为0,而该位的右方得以保留,如此循环,有几个1就做几次循环,举个例子画一画就一目了然了。
int numberOf1(int n){
int count = 0;
while(n){
count++;
n = (n - 1) & n;
}
return count;
}