经典编程题(持续更新)~

来源:互联网 发布:chm阅读器 windows 编辑:程序博客网 时间:2024/06/10 14:45

1.数值的整数次方

double powerwithunsigned(double base,unsigned exponent){    if(!exponent)        return 1;    if(exponent==1)        return base;    double result =powerwithunsigned(base,exponent >>1);//注意这里将右移代替了除法    result*=result;    if(exponent&0x1==1)//这里将与1的结果代替了判断奇偶        result*=base;    return result;}

《剑指offer》

2.删除字符串中所有的字符c

void squeeze(char *s,int c){    int i=0,j=0;    for(;s[i]!='\0';++i)        if(s[i]!=c)            s[j++]=s[i];//相当于拷贝到另一个数组        s[j]='\0';}

《c程序设计语言》K&R

3.参数为1的二进制位数

int bitcount(int x){    int cnt=0;    while(x)    {        x&=x-1;//非常经典的用法        ++cnt;    }    return cnt;}

《c程序设计语言》K&R

4.值交换

int inplace_swap(int *x,int *y)//b=(a^b)^a神奇的异或运算{*y=*x^*y;*x^=*y;*y^=*y;}

《深入理解计算机系统》

5.atoi

int atoi(char *s){    int i=0,n=0,sign;    for(;isspace (s[i]);++i)        ;    sign=(s[i]=='-')?-1:1;    if(s[i]=='-'||s[i]=='+')        ++i;    for(;isdigit (s[i]);++i)        n=n*10+s[i]-'0';    return sign*n;}

《c程序设计语言》K&R

6.转置字符串

void reverse(char *s){    int i,j ,c;    for(i=0,j=strlen(s)-1;i<j;++i,--j)    {        c=s[i];        s[i]=s[j];        s[j]=s[c];    }}

《c程序设计语言》K&R

7.itoa

void itoa(int n ,char*s){    int i=0,sign;    if((sign=n)<0)        n=-n;//这里最大负数求反还是其本身    do    {        s[i++]=n%10+'0';    }    while(n/=10>0);    if(sign<0)        s[i++]='-';    s[i]='\0';    reverse(s);}

针对n等于最大负数情况有如下改进:

void itoa2w(int n,char*s){    int i=0,sign;    sign=n;    do    {        s[i++]=abs(n%10)+'0';//直接对余数求绝对值    }    while((n/=10)!=0);//改为!=0因为n可能为负数    if(sign<0)        s[i++]='-';    s[i]='\0';    reverse(s);}

《c程序设计语言》K&R

8.反转单链表

ListNode* reverseList(ListNode* head) {        if(head==NULL)        return NULL;        ListNode* bp=NULL;        ListNode* p=head;        ListNode* ap=p->next;        while(ap!=NULL)       {            p->next=bp;            bp=p;            p=ap;            ap=ap->next;       }       p->next=bp;       return p;    }

《数据结构与算法分析-c》weiss

9.小于n的素数的个数

int countprimes(int n){    int *array=new int[n]();    int count=0;         for(int i=2;i<=(int)sqrt(n);++i)           {               if(!array[i])               {                   for(int j=i;i*j<n;++j)                   array[i*j]=true;               }           }           for(int i=2;i<n;++i)           if(!array[i])           ++count;           delete [] array;      return count;}

leetcode

10.找零钱

int small_change(int money)//钱{    int coin[]={5,2,1};//硬币种类    int cnt=0;    while(money)//功能简单,一目了然    {        if(money>=coin[0])        {            money-=coin[0];            ++cnt;        }        else if(money>=coin[1])        {            money-=coin[1];            ++cnt;        }        else if(money>=coin[2])        {            money-=coin[2];            ++cnt;        }    }    return cnt;}

by vashzx

0 0