1.求1+2+...+n
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)
思路:利用递归和布尔运算符,当n>0时,执行递归操作。
class Solution { public: int Sum_Solution(int n) { int sum=n; bool t=(n>0)&&(sum+=Sum_Solution(n-1)); return sum; } };
2.不用加减乘除做加法
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
class Solution { public: int Add(int num1, int num2) { /* 首先看十进制是如何做的: 5+7=12,三步走 第一步:相加各位的值,不算进位,得到2。 第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果。 第三步:重复上述两步,只是相加的值变成上述两步的得到的结果2和10,得到12。 同样我们可以用三步走的方式计算二进制值相加: 5-101,7-111 第一步:相加各位的值,不算进位, 得到010,二进制每位相加就相当于各位做异或操作,101^111。 第二步:计算进位值,得到1010,相当于各位做与操作得到101,再向左移一位得 到1010,(101&111)<<1。 第三步重复上述两步, 各位相加 010^1010=1000,进位值为100=(010&1010)<<1。 继续重复上述两步:1000^100 = 1100,进位值为0,跳出循环,1100为最终结果 */ int sum,carry; do { sum=num1^num2; carry=(num1&num2)<<1;//进位 num1=sum; num2=carry; } while(num2!=0);//进位为0则是结束条件 return num1; } };
3.实现字符串转整数函数
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。
思路:从头开始遍历,如果前面是空格,就继续遍历,出现第一个加号或减号,记录一个flag标志,接下来,如果遇到非数字字符,直接返回0,最后要进行一下得到整数是否越界的判断。
class Solution { public: int StrToInt(string str) { int len=str.length(); if(len==0) return 0;//空字符串 if(str=="-2147483649"||str=="2147483648") return 0;//两个特殊情况 int i=0; while(str[i]==' ') i++; int flag=1; int num=0; if(str[i]=='+') i++; if(str[i]=='-') { i++; flag=-1; }//开始的第一个非空格字符是正负号的情况 while(str[i]!='\0') { if(str[i]>='0'&&str[i]<='9') num=num*10+(str[i]-'0'); else return 0;//出现非法字符,直接返回0 i++; } if(((flag>0)&&(num>0x7FFFFFFF))||((flag<0)&&(num>0x80000000))) return 0;//大于最大整数或小于最小负数 return num*flag; } };
4.数组中重复的数字
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
思路:利用哈希表。
class Solution { public: // Parameters: // numbers: an array of integers // length: the length of array numbers // duplication: (Output) the duplicated number in the array number // Return value: true if the input is valid, and there are some duplications in the array number // otherwise false bool duplicate(int numbers[], int length, int* duplication) { if(numbers==NULL||length==0) return 0; int res[255]={0}; for(int i=0;i<length;i++) { res[numbers[i]]++; } int count=0; for(int i=0;i<length;i++) { if(res[numbers[i]]>1) { duplication[count++]=numbers[i]; //break; return true; } } return false; } };
5.构建乘积数组
给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=(A[0] * A[1] ... A[i-1] * A[i+1]...A[n-1])。不能使用除法。(注意:规定B[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2];)
思路:画一个矩阵图,可以发现1在左对角线上,先计算左面部分,可以看出 B[i]=B[i-1] * A[i-1],然后计算右面部分,temp * =A[i+1];B[i] * =temp;
class Solution { public: vector<int> multiply(const vector<int>& A) { int len=A.size(); vector<int> B(len,1); for(int i=1;i<len;i++) { B[i]=B[i-1]*A[i-1];//左面部分 } int temp=1; for(int i=len-2;i>=0;i--) { temp*=A[i+1]; B[i]*=temp;//右面部分 } return B; } };
6.正则表达式匹配
class Solution { public: bool match(char* str, char* pattern) { if (*str == '\0' && *pattern == '\0') return true;//若都为空,匹配 if (*str != '\0' && *pattern == '\0') return false;//第一个非空第二个空,不匹配 //if the next character in pattern is not '*' if (*(pattern+1) != '*') { if (*str == *pattern || (*str != '\0' && *pattern == '.')) return match(str+1, pattern+1);//直接匹配,如果二者相等或str不为空,pattern为.则成功 else return false;//不成功直接返回 } //if the next character is '*' else { if (*str == *pattern || (*str != '\0' && *pattern == '.')) return match(str, pattern+2) || match(str+1, pattern);//当*匹配1个或多个字符,aaa与aa*aa aaa与a* else return match(str, pattern+2);//当*匹配0个字符时 } } };