zoukankan      html  css  js  c++  java
  • 剑指offer-学习笔记

    前言:18/06/06开始学习,每个程序都会用C写一遍,因书中用C++举例,也会换种思路写,供学习和参考!!!很推荐这本书很不错,准备入手,一般不买实体书,都用电子书,因一般都看一遍,但这本会看很多遍!无论刚毕业,还是跳槽都可以看一下...

    面试题3:二维数组中的查找

    题目如图,所有题目截图均引自《剑指offer》,接下来不再说明!

    书中从右上角开始查找,我的程序从左下角查找:

    #include<stdio.h>
    #include<stdbool.h>
    
    bool Find(int (*num)[4],int rows,int column,int number)
    {
        bool found = false;
        if(num!=NULL && rows>0 && column>0)
        {   
            int col = 0;
            int row = rows-1;
            while(col<column && row>=0)
            {   
                if((*num)[row*column+col] == number)
                {   
                    found = true;
                    break;
                }   
                if((*num)[row*column+col] < number)
                     ++col;
                else
                    --row;    
            }   
        }   
        return found;
    }
    int main()
    {
        int number;
        int num[4][4] = {{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
        puts("please input your number:");
        scanf("%d",&number);
        bool res = false;
        res = Find(num,4,4,number);
        printf("res:%d
    ",res);
        return 0;
    }

    对逻辑不理解的,可以随时留言,随时解答!!!

    面试题4:

    代码如下:

    #include<stdio.h>
    
    void ReplaceBlank(char string[],int length)
    {
        if(string==NULL && length<=0)
            return;
        int originalLen = 0;//字符串实际长度
        int numBlank=0,i=0;
        while(string[i] != '')
        {
            ++originalLen;
            if(string[i] == ' ')
               ++numBlank;
            ++i;
        }
    
        //替换后的长度
        int newLen = originalLen + numBlank*2;
        if(newLen > length)
            return;
    
        int indexLen = originalLen;
        int indexOfNew = newLen;
        while(indexLen>=0 && indexOfNew>indexLen)
        {   
            if(string[indexLen] == ' ')
            {   
                string[indexOfNew--]='0';
                string[indexOfNew--]='2';
                string[indexOfNew--]='%';
            }
            else
            {
                string[indexOfNew--] = string[indexLen];
            }
            --indexLen;
        }
    }
    
    int main()
    {
        char buf[]={"hello world!"};
        ReplaceBlank(buf,20);
        printf("buf:%s
    ",buf);
        return 0;
    }

    注:重点理解从尾到头遍历的时间复杂度为O(n)!!!

    面试题5:

    #include<stdio.h>
    #include<stdlib.h>
    
    typedef int data_t;
    //栈结构
    typedef struct LIFO
    {
        int *data;  // 4字节的指针 指向数组(后分配的数组)
        int maxlen;    // 存储数据的个数最大值
        int top;
    }seqstack_t;
    
    //链表结构
    typedef struct node{
        int data;
        struct node *next;
    }linknode_t,* linklist_t;
    
    //创建空的链表
    linknode_t *CreateLink()
    {
        linknode_t *H;
        H = (linklist_t)malloc(sizeof(linknode_t));
        H->next = NULL;
        return H;
    }
    
    //初始化一个空链表
    void InitLink(linknode_t *H)
    {
        linknode_t *r,*p;//r指向队尾
        r = H;
        int i=0;
        for(;i<5;i++)
        {
                p = (linklist_t)malloc(sizeof(linknode_t));
                p->data = i+1;
                p->next = NULL;
                r->next = p;
                r = p;//再将r指向队尾
        }
    }
    
    //打印所有节点
    linknode_t * ShowLink(linknode_t *H,seqstack_t *T)
    {
        linknode_t *p,*r;
        int temp=0;
        p = H->next;
        while(p != NULL)
        {
                T->data[T->top]=p->data;
                p = p->next;
                T->top++;
        }
        --T->top;    
        while(T->top>=0)
        {
                printf("data:%-5d",T->data[T->top]);
                T->top--;
        }
    }
    
    //清空链表
    void ClearLink(linknode_t *H)
    {
        linknode_t *p,*q;//p是删除的节点,q记录下一个要删除的节点
        q = H->next;
        while(q != NULL)
        {
                p = q;
                q = p->next;
                free(p);
        }
        printf("
    ");
        H->next = NULL;
    }
    
    seqstack_t *  CreateStack(int max)
    {
        seqstack_t *H;   // 分配结构体空间 --> 一个栈
        H = (seqstack_t *)malloc(sizeof(seqstack_t));     
        H->data = (data_t *)malloc(sizeof(data_t) * max);// 结构体成员赋值
        H->maxlen = max;
        H->top = 0;  
        return H;
    }
    
    int main()
    {
        seqstack_t *T=CreateStack(10); // 获取一个空的栈
        linknode_t *H=CreateLink();
        InitLink(H);
        ShowLink(H,T);
        ClearLink(H);
        free(H);
    
        return 0;
    }

    注:用栈的后进先出LIFO思想实现链表的从尾到头的输出!!!

    未完待续......

  • 相关阅读:
    剑指offer二十九---最小的k个数
    Select2插件 点击、选中事件 解读
    Datatable插件的简单的使用方式 和 学习方式
    java map获取值方式
    mysql delete语句使用别名报错
    springmvc 添加@ResponseBody
    maven 创建后报错
    nodejs
    gulp
    Nodejs-express 4.0框架 简单介绍
  • 原文地址:https://www.cnblogs.com/liudw-0215/p/9147002.html
Copyright © 2011-2022 走看看