学习笔记1

来源:互联网 发布:风险矩阵法优缺点 编辑:程序博客网 时间:2024/06/05 15:23

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.荷兰国旗问题
int f(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;}



0 0
原创粉丝点击