Intenta 笔试总结
1. struct 构造函数
struct A
{
int a;
int b;
A() : b(1), a(b) {}
};
这样定义结构体会出现什么问题吗?
这里有一个初始化队伍的问题。初始化队伍这里指的就是构造方法中冒号后面的部分。
编译器在处理初始化队伍时,会根据成员变量的声明次序重新排序。也就是说,虽然构造方法是先对b进行初始化,但是,根据a和b的声明次序,实际上是先对a初始化,然后再对b进行初始化。这样一来,由于b还未初始化,所以最终的结果是a的值并不是1。下面是我在visual studio 2010下输出的结果:
请在这里输入引用内容
-858993460 1
所以建议,如果是用一个数据成员对另一个数据成员进行初始化,即赋值,最好是把这样的代码写在构造函数体内(显式代码)。
2. 计算X的N次幂的最小时间复杂度
时间复杂度为O(logn)的方法,递归关系可以表示为pow(x,n) = pow(x,n/2)*pow(x,n-n/2)
double pow(double x, int n)
{
if(n==0)
return 1.0;
if(n<0)
return 1.0/pow(x,-n);
double half = pow(x,n>>1);
if(n%2==0)
return half*half;
else
return half*half*x;
}
3. 整型除以整型
int整数除以int整数一定得到的是int整数.
除数或被除数至少有一个是double或float,才有可能得到小数.
4. ASCII码与字符相互转换
在计算机存储中,用ASCII码表示字符,如字符char a,及整形int m:
- 获取字符的ASCII码:(int)a
- 获取ASCII码对应的字符:(char)m
- 字符之间相加减,实质是对应的ASCII码相加减,结果为整形,如下列:
a - b 即a的ASCII码减去b的ASCII码,记为int k = a - b
5. 判断两个字符串是否由相同字符组成(大小写不敏感)
int upperToLower(char ch)
{
int ascii = int(ch);
if (ascii < 97)
{
ascii += 32;
}
return ascii;
}
bool isMatch(const string& s1, const string& s2)
{
int len1 = s1.length();
int len2 = s2.length();
if (len1 != len2)
return false;
int count[256] = { 0 };
for (int i = 0; i < len1; ++i)
{
count[upperToLower(s1[i])]++;
count[upperToLower(s2[i])]--;
}
for (int i = 0; i < len1; ++i)
{
if (count[upperToLower(s1[i])] != 0)
return false;
}
return true;
}
浙公网安备 33010602011771号