1、字符串原地逆序(使用临时变量)
void reverse(string &s)
{
for(int i=0,j=s.size()-1;i<j;++i,--j)
{
char tmp=s[i];
s[i]=s[j];
s[j]=tmp;
}
}
2、字符串原地逆序(不使用临时变量)
void reverse(string &s)
{
for(int i=0,j=s.size()-1;i<j;++i,--j)
{
s[i]^=s[j];
s[j]^=s[i];
s[i]^=s[j];
}
}
3、单词逆序
void reverseWord(string &s,int p,int q)
{
for(;p<q;++p,--q)
{
s[p]^=s[q];
s[q]^=s[p];
s[p]^=s[q];
}
}
void reverseSentence(string &s)
{
int i=0,j=0,n=s.size();
while(j<n)
{
if(s[j]!=' ')++j;
else
{
reverseWord(s,i,j-1);
i=++j;
}
}
reverseWord(s,i,j-1);
reverseWord(s,0,n-1);
}
4、荷兰国旗问题
用0、1、2分别表示3种颜色,0~i-1为0,i~j-1为1,j~k待定,k+1~n-1为2
int tricolor(int *A,int n)
{
int i=0,j=0,k=n-1;
while(j<=k)
{
if(A[j]==0)swap(A[i++],A[j++]);
else if(A[j]==1)j++;
else swap(A[j],A[k--]);
}
}
5、求平均值(避免溢出)
int f(int x,int y)
{
return (x&y)+((x^y)>>1);
}
6、杨氏矩阵
bool Young(int a[m][n],int x)
{
for(int i=0,j=n-1;i<m&&j>=0;)
{
if(a[i][j]<x)++i;
else if(a[i][j]>x)--j;
else return true;
}
return false;
}
7、十进制转十六进制
string decimalToHexadecimal(unsigned n)
{
if(n==0)return "0";
string s="0123456789abcdef",res;
while(n)
{
res=s[n&15]+res;
n>>=4;
}
return res;
}
8、(Google面试题)你拿着两个鸡蛋站在m层的大楼上。鸡蛋或许结实到从楼顶掉下也不会摔破,或许很易碎,在一楼摔下就破碎。最少试验多少次可以找出鸡蛋不会被摔碎的最高楼层?
设最少试验n次可以找出鸡蛋不会被摔碎的最高楼层,n(n+1)/2>=m,当m=100时,n>=14
9、字符串压缩
string compression(string s)
{
string res;
if(s.size()==0)return res;
int i=0,j=0;
while(j<s.size())
{
if(s[i]==s[j])++j;
else
{
if(j-i>1)result+=j-i+'0';
result+=s[i];
i=j;
}
}
if(j-i>1)result+=j-i+'0';
result+=s[i];
return result;
}
10、求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)
int f(int n)
{
int num=0;
n&&(num=f(n-1)+n);
return num;
}
int f(int n)
{
int num=0;
!n||(num=f(n-1)+n);
return num;
}
11、a的n次方
时间复杂度为O(logn)
double pow(double a,unsigned n)
{
double y=1,f=a;
while(n)
{
if(n&1)y*=f;
n>>=1;
f*=f;
}
return y;
}
12、埃拉托斯特尼筛法
bool isPrime(int n)
{
if(n<2)return false;
for(int i=2;i*i<=n;i++)
{
if(n%i==0)return false;
}
return true;
}
//vector<bool> A(n+1,true);
void EratosthenesSieve(vector<bool> &A,int n)
{
for(int i=2;i*i<=n;i++)
{
if(A[i])
{
for(int j=i*i;j<=n;j+=i)A[j]=false;
}
}
}
13、写一个去除字符串左边空格,右边空格,字符串中间如果出现多个空格,则合并成一个空格的程序。例如,输入“ a b c ”,则输出“a b c”
void f(char *s)
{
int i=0,j=0;
while(s[j]!='\0')
{
while(s[j]!='\0'&&s[j]==' ')++j;
if(s[j]=='\0')s[i-1]='\0';
while(s[j]!='\0'&&s[j]!=' ')s[i++]=s[j++];
if(s[j]=='\0')s[i]='\0';
else s[i++]=' ';
}
}
14、字符串包含
bool contain(string s,string t)
{
int hash=0;
for(int i=0;i<s.size();++i)hash|=(1<<(s[i]-'A'));
for(int i=0;i<t.size();++i)
{
if(hash&(1<<(t[i]-'A'))==0)return false;
}
return true;
}