(转载)C++面试宝典2011版 (19)

选择排序(Selection Sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。

112.运算符优先级问题

能正确表示a和b同时为正或同时为负的逻辑表达式是(D )。

sssA、(a>=0||b>=0)&&(a<0||b<0) 
B、(a>=0&&b>=0)&&(a<0&&b<0) 
C、(a+b>0)&&(a+b<=0) 
D、a*b>0

以下关于运算符优先顺序的描述中正确的是(C)。 
A、关系运算符<算术运算符<赋值运算符<逻辑与运算符 
B、逻辑与运算符<关系运算符<算术运算符<赋值运算符 
C、赋值运算符<逻辑与运算符<关系运算符<算术运算符 
D、算术运算符<关系运算符<赋值运算符<逻辑与运算符

113.字符串倒序

写一个函数将"tom is cat" 倒序打印出来,即 "cat is tom"

//a.ch

#define SPACE \' \'
#define ENDL \'\0\'

char* str = "Tom is cat"; // 字符串
char* p1 = str+strlen(str)-1;
char* p2 = p1; // 开始时,p1,p2都指向字符串结尾处
char t=0; // 临时变量,用来保存被临时替换为ENDL的字符

while(str!=p1--)
{
  if(SPACE!=*p1){
     for(p2=p1+1;SPACE!=*p1; p1--, t=*p2, *p2=ENDL);

     // p1+1指向单词的第一个字母,p2指向单词的结尾,此时输出这个单词
                printf("%s ",p1+1);
                *p2=t;
                p2=p1;
         }
}

Output:
cat is Tom

----------------------------------------------------------------------
1)写一个递归函数将内存中的字符串翻转"abc"->"cba"
2)写一个函数将"tom is cat" 将内存中的字符串翻转,即 "cat is tomm" 

#include <stdio.h>
#define SPACE \' \'
#define ENDL \'\0\'
char* s = "The quick brown fox jumps over the lazy dog";

void str_reverse(char* p1,char* p2){
      if(p1==p2)return;
    *p1 = (*p1)+(*p2);
    *p2 = (*p1)-(*p2);
    *p1 = (*p1)-(*p2);
      if(p1==p2-1)return;
      else str_reverse(++p1,--p2);
}

void str_word_reverse(char* str){
      char *q1=str, *q2=str, *t;

while(*q1==SPACE)q1++;
      if(*q1==ENDL)return; //!
      else q2=q1+1;

while( (*q2!=SPACE) && (*q2!=ENDL) )q2++;
    
     t=q2--; 
    str_reverse(q1,q2);

if(*t==ENDL)return;
      else str_word_reverse(t);
}

int
main(int a ,char** b)
{
    printf("%s\n",s);
    str_reverse(s,s+strlen(s)-1);
    printf("%s\n",s);
    str_word_reverse(s);
    printf("%s\n",s);
           return 0;
}

Output:

The quick brown fox jumps over the lazy dog
god yzal eht revo spmuj xof nworb kciuq ehT
dog lazy the over jumps fox brown quick The

----------------------------------------------------------------------
今天同学又问一道题,和上面有些类似,但是要求更严格了一些:
写一个递归函数将内存中的字符串翻转"abc"->"cba",并且函数原型已确定:void reverse(char* p)

其实,要求越多,思路越确定,我的解如下:

#include <stdio.h>
#include <string.h>
char* s = "0123456789";
#define ENDL \'\0\'
void reverse(char* p){
       //这是这种方法的关键,使用static为的是能用str_reverse的思路,但是不好
       static char* x=0;
       if(x==0)x=p;
       char* q = x+strlen(p)-1; 
       if(p==q)return;
       *q=(*p)^(*q);
       *p=(*p)^(*q);
       *q =(*p)^(*q);
       if(q==p+1)return;
       reverse(++p);
}

//这种方法就直观多了,但是当字符串很长的时候就很低效
void reverse2(char* p){
       if(*(p+1)==ENDL)return;
       for(char* o=p+strlen(p)-1,char t=*o;o!=p;o--)
          *o=*(o-1);
       *p=t;
       reverse2(p+1);
}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgwfdg.html