• 程序员面试宝典2(数据结构与算法)


    1. 删除C/C++代码中的注释

    #include <cstdlib>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    void remove_comment(char *buf,int n){
        char *p=buf,*end=buf+n;
        char *sq_start,*dq_start,*lc_start,*bc_start;
        sq_start=0;//字符:单引号开始
        dq_start=0;//字符串:双引号开始
        lc_start=0;//C++注释//
        bc_start=0;//C语言注释/**/
        while(p<end){
            char c=*p;
            switch(c){
                case '\'':
                    if(dq_start||lc_start||bc_start){
                        //忽略字符串和注释中的单引号
                        p++;
                        continue;
                    }
                    if(sq_start==0){
                        sq_start=p++;
                    }
                    else{
                        int len=p++-sq_start;
                        if(len==2&&*(sq_start+1)=='\\')//忽略字符中的单引号
                            continue;
                        sq_start=0;
                    }
                    break;
                case '\"':/* 双引号 */
                    if(sq_start||lc_start||bc_start){
                        p++;/* 忽略字符和注释中的双引号 */
                        continue;
                    }
                    if(dq_start==0){
                        dq_start=p++;
                    }
                    else{
                        if(*(p++-1)=='\\')//忽略字符串中的双引号
                            continue;
                        dq_start=0;
                    }
                    break;
                case '/':
                    if(sq_start||dq_start||lc_start||bc_start) {
                        p++;//忽略字符、字符串或注释中的斜杠
                        continue;
                    }
                    c=*(p+1);
                    if(c=='/'){
                        lc_start=p;
                        p+=2;
                    }
                    else if(c=='*'){
                        bc_start=p;
                        p+=2;
                    }
                    else
                        p++;//忽略除号
                    break;
                case '*':
                    if(sq_start||dq_start||lc_start||bc_start==0) {
                        //忽略字符、字符串或行注释中的星号,还有忽略乘号
                        p++;
                        continue;
                    }
                    if(*(p+1)!='/'){
                        p++;//忽略注释块中的星号
                        continue;
                    }
                    p+=2;
                    memset(bc_start,' ',p-bc_start);
                    bc_start=0;
                    break;
                case '\n':
                    if(lc_start==0){
                        p++;
                        continue;
                    }
                    memset(lc_start,' ',(*(p+1)=='\r'?p++-1:p++)-lc_start);
                    lc_start=0;

                    break;
                default:
                    p++;
                    break;
            }
        }
        if(lc_start)
            memset(lc_start,' ',p-lc_start);
    }
    int main(int argc,char* argv[]){
        if(argc<2){
            printf("Usage: %s filename\n",argv[0]);
            exit(-1);
        }
        FILE* f;
        f=fopen(argv[1],"r");
        char buf[BUFSIZ];
        size_t len=fread(buf,1,BUFSIZ,f);
        if(len==0){
            printf("Error during reading file:%s\n",argv[1]);
            fclose(f);
            exit(-1);
        }
        //printf("test\n");
        remove_comment(buf,len);
        buf[len]='\0';
        printf("%s",buf);
        /*******\\\\\//////////    */

        fclose(f);
        return 0;
    }
    //dkdkdfjdsafsdakkkkkk
    /*
     dafkdsf*/  //  idfdfdffffffffffffffffff
    //     asdfdsaf
    //
    /*
     *********\\\\\\////// *////////

     

    2. 给定一个单链表, 不知道结点N的值,怎样遍历一遍就可以找出中间节点?

    解答:

    设立两个指针, 比如*p和*q. p每次移动两个位置, 即p=p->next->nex, q每次移动一个位置, 即q=q->next, 当p到达最后一个节点的时候,q就是中间节点了.

     

    3. 查找字符串中连续出现次数最多的子串

    int find_successive_substr(char* str,char *sub_str){
        int len=strlen(str);
        int max_cnt=0;
        int i,j,k;
        for(i=0;i<len-1;i++){
            for(j=i+1;j<len;j++){
                int n=j-i;//因为要求的子串是连续的,所以n就是该子串的长度
                int tmp_cnt=1;
                if(strncmp(&str[i],&str[j],n)==0){//首先判断是否和下一子串相等,相等的话就进行连续查找。
                    tmp_cnt++;
                    for(k=j+n;k<len;k+=n){//判断接下来的每n个字符组成的子串是否和前面的相等
                        if(strncmp(&str[i],&str[k],n)==0)
                            tmp_cnt++;
                        else
                            break;
                    }
                    if(tmp_cnt>max_cnt){
                        max_cnt=tmp_cnt;
                        strncpy(sub_str,str+i,n);
                    }
                }
            }
        }
        return max_cnt;
    }
    void find_successive_substr_test(){
        char *str="abcc";
        char sub_str[256];
        int n=find_successive_substr(str,sub_str);
        printf("%d,%s\n",n,sub_str);
    }

     

    4. 字符串转换为出现的字符和次数

    void str_convert(char *str,char *str2){
        int len=strlen(str);
        int i;
        int count=1;
        int k=0;
        for(i=0;i<len-1;i++){
            if(str[i]==str[i+1])
                count++;
            else{
                sprintf(str2+k,"%c%d",str[i],count);
                k+=2;
                count=1;
            }
        }
        sprintf(str2+k,"%c%d",str[i],count);
    }
    void str_convert_test(){
        char *s="123342";                               
        char str[512];
        str_convert(s,str);
        printf("%s\n",str);
    }
  • 相关阅读:
    第五周课后作业
    第五周读书笔记
    PB16120853+JL17110067
    第一次个人作业报告
    《编程匠艺》读书笔记----第四周
    软工第一次个人作业博客(一)
    软工第一次个人作业博客(二)
    《程序员修炼之道》读书笔记(二)--第三周
    关于在aspx前台使用后台变量的问题
    sql语句优化SQL Server
  • 原文地址:https://www.cnblogs.com/xkfz007/p/2720497.html
Copyright © 2020-2023  润新知