剑指offer-学习笔记

liudw-0215 2018-06-06 原文

剑指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\n",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] != '\0')
    {
        ++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\n",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("\n");
    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思想实现链表的从尾到头的输出!!!

未完待续……

 

发表于 2018-06-06 19:55 liudw 阅读() 评论() 编辑 收藏

 

版权声明:本文为liudw-0215原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/liudw-0215/p/9147002.html

剑指offer-学习笔记的更多相关文章

  1. SCIP:构造过程抽象–python学习

    心智的活动,除了尽力产生各种简单的认知之外,主要表现为如下三个方面:(1)将若干简单认知组合为一个复合的认识, […]...

  2. 重构:改善既有代码的设计(第二版读书笔记) – 重构、坏代码、写好代码

    偶然发现重构这本书推出了js版,果断入手,名书之一,尤其还是js版本,相较于java版来说,肯定更适合前端阅读 […]...

  3. 深入浅出图神经网络 第3章 卷积神经网络 读书笔记

    《深入浅出图神经网络》第3章的个人读书笔记 第3章 卷积神经网络 卷积神经网络CNN是目前应用最广泛的模型之一 […]...

  4. 读薄《高性能MySql》(一)MySql基本知识

    高性能 Mysql 的读书笔记。因为这本书写的实在是太好了,即使只是随便翻一下都让人受用无穷。于是写下读书笔记 […]...

  5. 悦读 | 理想主义者的突围,读《曾国藩的正面与侧面》

    他善于从庸常琐碎的现实生活中汲取并提炼智慧,善于从他所接触的一切精神资源中,探寻有用的东西,他的理想主义与现实 […]...

  6. 重新梳理调度器——GMP 调度模型

    重新梳理调度器——GMP 调度模型 2021-07-17 01:11  沉睡的木木夕  阅读(0)  评论(0 […]...

  7. 读书笔记(一):用户登录

    作为测试工程师的目标:保证系统在各个应用场景下功能是符合设计的,因此在设计测试用例时需要更全面 最常用、最典型 […]...

  8. 深入理解jvm-2Edition-类文件结构

    概述:   规范而独立的类文件结构以及只与类文件关联的虚拟机为Java实现了平台无关性,甚至还带来了一些语言无 […]...

随机推荐

  1. MySQL里的COUNT

    count(*)、count(1)、count(主键)、count(字段)的执行效率 在没有where条件的情 […]...

  2. Allegro PCB -通孔焊盘制作 及Flash制作

    通孔焊盘制作,比如插针封装 数值确定: mil单位                               […]...

  3. Python学习笔记(matplotlib实战篇)–球员能力图

    Python学习笔记–球员能力图   参靠视频:《Python数据可视化分析 matplotlib […]...

  4. 4.C#WebAPI多版本管理介绍及实现方案详解

    1.什么是 API 的多版本? 说白了就是多版本共存的问题。为方便大家理解我就举个例子吧,大家想必都用过Jqu […]...

  5. 用Javascript跨平台开发手机Native App

    实践了下Moscrif,就是那个javascript开发native app的解决方案。 与PhoneGap等 […]...

  6. Html5web全栈前端开发_angular框架

    昵称领取全套angular视频教程 一、Typescript typescript简称ts,是js语法的超集, […]...

  7. 大学计算机软件专业在线课程推荐系列——总目录

    关于课程推荐的总目录 大学计算机软件专业在线课程推荐系列——总目录 博主从高中时代即关注mooc,大学前两年也 […]...

  8. 优秀的音频编辑软件-WavePad

    WavePad for Mac是一款非常优秀的音频编辑软件,WavePad能轻松制作和编辑语音和其他音频录音, […]...

展开目录

目录导航