1 二进制加法
给定两个字符串a,b,每个字符串中是二进制数,编程实现两个数相加的结果。
例,a=“11”,b=“1”,return “100”
思路:首先逆置字符串使低位对齐,每遍历(按最大的长度遍历)一次,两个对应位相加,再加上低位的进位,若某个字符串上没有数字的时候(下标是否>=字符串长度-1),加上0。用String累加每一位上产生的结果,最终把String反转,就是最终结果。
string addBinary(string a, string b)
{
if (a.empty()||a.length()==0)
return b;
if (b.empty()||b.length()==0)
return a;
string c=a,d=b,result;
reverse_copy(a.begin(),a.end(),c.begin());
reverse_copy(b.begin(),b.end(),d.begin());
int alen = a.length();
int blen = b.length();
int maxlen = max(alen,blen);
int carry=0;//进位
int sum;//存储每一位相加的和
for (int i = 0; i < maxlen; ++i) {
if (i<=alen-1&&i<=blen-1)
{
sum = (c[i]-'0') + (d[i]-'0') + carry;//和
}
else if (i>alen-1)
{
sum = 0 + (d[i]-'0') + carry;
} else
{
sum = (c[i]-'0') + 0 + carry;
}
result.append(to_string(sum%2));
carry = sum/2;
}
if (carry!=0)
result.append(to_string(carry));
reverse(result,0,result.length()-1);
return result;
}
2 加一
给定一个int数组,数组最低位存放int的最高位,编程实现此int数加1的结果。
例,int []a=[9,9] return [100]
思路:令进位为1,从数组的最低位开始加1,根据相加结果,修改数组最后一位和进位,若出现进位为0,则退出,若最后进位不为0,则拷贝原数组到新数组(长度为原数组+1),数组最高位置位进位。
vector<int> plusOne(vector<int> a)
{
vector<int> result=a;
int carry = 1;//进位
if(a.size()==0||a.empty())
return result;
for (int i = result.size()-1; i >=0 ; --i) {
int sum = result[i]+carry;
result[i] = sum%10;
carry = sum/10;
if (carry==0)
return result;
}
result.insert(result.begin(),carry);
return result;
}
3 找出非负整数N中的素数个数
例如,5以内的素数为2,3。return 2
思路:筛法——从2到根号N中,依次对每个数求次幂,得到的数为合数,在结果中把这些数去掉就是素数。
int countPrimes(int n)
{//寻找n以内的质数,从2到根号n之间,把每个数的倍数去掉,留下的就是素数
if(n<=1)
return 0;
map<int,int> m;
for (int i = 2; i <= sqrt(n); ++i) {
for (int j = 2; j*i<n; ++j) {
m[i*j]=1;
}
}
vector<int> result;
for (int k = 2; k < n; ++k) {
if (m[k]==1)
{
continue;
} else
result.push_back(k);
}
return result.size();
}
翻转int
例:123,return 321
思路:遇到数字问题,注意两个问题,越界和符号
int reverseInterger(int n)
{
if (n==0)
return 0;
int sign=1;//符号位
if (n<0)
sign=-1;
int temp = abs(n);
long result=0;
while (temp>0)
{
result=result*10+temp%10;
temp/=10;
}
if((sign==1&&result>INT8_MAX)||(sign==-1&&(-1)*result<INT8_MIN))
return 0;
return sign*int(result);
}