学习笔记1

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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值