写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
刚开始想到的是利用,数组或者字符串的插入删除操作,来进行求解,但是,考虑了一下,情况太多,一时间,插入删除的情况,数组又存在越界的情况所以有点麻烦,就放弃了,但是要是说写的话,其实也是可以写的,只是比较麻烦。
接着是利用++,–,虽然说是不使用±*/,但是++,–不算在里面的,这个算是取巧的写法,不值得参考。
class Solution {
public:
int Add(int num1, int num2)
{
if(num1 > 0)
{
while(num1-- != 0)
{
num2++;
}
}
else if(num1 < 0)
{
while(num1++ != 0)
{
num2--;
}
}
return num2;
}
};
接着比较正规的写法就是利用位操作符
第二种解法:
class Solution {
public:
int Add(int num1, int num2)
{
while(num1 != 0)
{
int temp = num1 ^ num2;
num1 = (num1 & num2 )<< 1;
num2 = temp;
}
return num2;
}
};
第二题:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
情况比较多,需要仔细划分。
class Solution {
public:
bool isNumeric(char* string)
{
bool zhengfuhao = false, fuhao_E = false,xiaoshudian = false;
for(int i = 0; i < strlen(string);++i)
{
if(string[i] == 'E' || string[i] == 'e') //关于E/e符号的处理
{
if(i == strlen(string) - 1) //如果E/e后面不再有数字,直接返回错误
{
return false;
}
if(fuhao_E) //如果是第二次出现E/e直接返回错误
{
return false;
}
fuhao_E = true;
}
//+-号的问题
else if(string[i] == '+' || string[i] == '-')
{
//第二次出现正负号,前面必须跟e/E否则报错
if(zhengfuhao && string[i - 1] != 'e' && string[i - 1] != 'E')
{
return false;
}
//假如+-号不是在第一个字符出现,但是第一次出现+-号那么他的前面一定要是e/E
else if(!zhengfuhao && i > 0 && string[i - 1] != 'e' && string[i - 1] != 'E')
{
return false;
}
zhengfuhao = true;
}
else if(string[i] == '.')
{
if(fuhao_E || xiaoshudian) //E/e后面不能出现小数点,所以当E已经存在的时候再出现小数点,或者小数点已经存在的时候再出现小数点返回错误
{
return false;
}
xiaoshudian = true;
}
else if( string[i] < '0' || string[i] > '9')
return false;
}
return true;
}
};