自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(129)
  • 收藏
  • 关注

原创 源代码生成可执行程序过程

问:经常敲代码,代码是如何生成可执行程序的? 答:过程分为两个大的过程:翻译和链接;翻译分为编译和链接;编译又分为预编译,编译,汇编三个过程(具体过程看下图) 程序编码: gcc test.c -o test 1)第一步:预处理器扩展源代码—–展开头文件(#include命令包含文件),#define定义标识符的替换,去除注释 2)第二步:编译器产生两个源文件的汇编代

2018-02-01 21:41:19 6086

原创 剑指offer---17(打印1到最大n位数)

更多题目请点链接:《剑指offer》目录索引问题描述: 输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。思路1: (1)此题可归为大数处理问题:n可能很大,打印最大的n位数就存在溢出现象 (2)解决方法:采用高精度算法;使用一个数组arr来表示所要打印的数,将其以字符串的形式存储,并模拟数字加法 (...

2018-02-01 20:54:13 304

原创 剑指offer---16(数值的整数次方)

更多题目请点链接:《剑指offer》目录索引问题描述: 实现一个函数double Power(double base,int exponent),求base 的 exponent次方。不得使用库函数,同时不需要考虑大数问题思路: 数值的整数次方,我们可以从以下几个方面考虑: 1)base的取值:非0还是0,如果非0,则进行计算,如果是0,需进行特殊处理 ...

2018-01-28 14:49:02 222

原创 剑指offer----015(剪绳子)

更多题目请点链接:《剑指offer》目录索引问题描述: 给你一根长度为n绳子,请把绳子剪成m段(m、n都是整数,n>1并且m≥1)。每段的绳子的长度记为k[0]、k[1]、……、k[m]。k[0]* k[1]*……*k[m]可能的最大乘积是多少?例如当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此 时得到最大的乘积18。算法1:动态规划 采用递归思...

2018-01-27 17:34:42 569

原创 剑指offer----015(二进制中1的个数)

更多题目请点链接:《剑指offer》目录索引问题描述: 请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如:把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2思路1: 求二进制1的个数,首先想到操作符&(按位与),&规则:0&1=1 1&1=1 采用&的规则,对应的二进制位&1,并...

2018-01-27 12:42:11 368

原创 几种算法-----n的阶乘

问题描述: 输入一个正整数n,输出n!的值。 其中n!=1*2*3*…*n。算法 1 —–递归long long Factorial(long long n){ if(n==1) return 1; return Factorial(n-1)*n;}void Test1(){ printf("%lld\n",Factorial(1));

2018-01-25 17:43:34 25724 2

原创 剑指offer---012(字符串在矩阵中的路径)

更多题目请点链接:《剑指offer》目录索引问题描述: 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用下划线标出)。但矩阵中不包含字符串“abf...

2018-01-24 18:19:49 361

原创 剑指offer----013(机器人运动的范围)

更多题目请点链接:《剑指offer》目录索引问题描述: 地上有一个m行n列的方格。一个机器人从坐标(0, 0)的格子开始移动,它每一次可以向左、右、上、下移动一格,但不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格(35, 37),因为3+5+3+7=18。但它不能进入方格(35, 38),因为3+5+3+8=19。请问该机器人能够到达多少个格子...

2018-01-24 17:41:08 233

原创 剑指offer---011(旋转数组中的最小数字)

更多题目请点链接:《剑指offer》目录索引问题描述: 把一个数组最开始的若干元素搬到数组的末尾,我们称之为数组的一个旋转,输出旋转数组的最小元素。例如,数组{3,4,5,1,2}为{1, 2, 3 ,4 , 5,}的一个旋转数组,该数组的最小值为1分析问题: 根据描述,可以看到旋转数组有几个特点: 1) 未旋转之前的数组是一个有序数组 2) 旋转之后的...

2018-01-23 10:24:56 197

原创 剑指offer---010(斐波那契数列)

更多题目请点链接:《剑指offer》目录索引问题描述: 写入一个函数,输入n,求斐波那契数列的第n项,斐波那契数列的定义如下: 思路: 三种算法:递归,非递归,矩阵 时间复杂度:递归O(2^n),非递归O(n),矩阵O(logn) 算法比较:递归算法效率低,重复计算,容易溢出;非递归算法避免重复计算,比较实用;矩阵算法效率高,但包含生僻的数学算法,不实用...

2018-01-21 19:08:31 351

原创 剑指offer----005(字符串空格替换)

更多题目请点链接:《剑指offer》目录索引问题描述: 实现一个函数,将字符串中的每个空格替换成%20。例如:”We are hanppy.“,则输出“We%20are%20happy.”,要求时间复杂度为O(n)问题分析: 根据描述,此题意思改变字符串内容,并且改变了原字符串长度; 要求时间复杂度为0(n),故不能直接替换;思路: 第一步,...

2018-01-19 14:24:13 319

原创 剑指offer------004(二维数组中查找整数)

更多题目请点链接:《剑指offer》目录索引问题描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数分析问题:从问题描述中,可以确定一下几点: 1)在二维数组中查找整数,根据学过的知识可知,二维数组可看做一维数组,故此题可在一维数组中求解 2)此数组的...

2018-01-18 16:32:12 352

原创 【栈和队列面试题】------双栈实现队列,双队列实现栈

问题一:使用两个栈实现队列及其基本操作 思路:栈具有特点后进先出特点,队列具有先进先出的特点,两个栈实现队列,满足以下条件: 入数据时,始终保证栈为空 出数据时,取非空栈的栈顶元素 具体代码://初始化void QueueByTwoStackInit(QBTS* q){ StackInit(&q->_s1); StackInit(&q->_s2);}

2018-01-08 21:32:20 1067

原创 【栈和队列面试题】-----栈的最小值、出栈入栈顺序的合法性

问题1:实现一个栈,要求实现入栈(Push)出栈(Pop)返回最小值(Min),要求时间复杂度为0(1)问题分析:由前面所写的栈的基本操作,我们可知,入栈和出栈的时间复杂度都为0(1),故只需在返回最小值时算法时,满足时间复杂度为0(1)即可思路:以空间换时间,借助双栈(具体过程看下图)具体代码://初始化void MinStackInit(MinStack* mins)

2018-01-07 21:35:13 496

原创 迷宫问题

问题描述 迷宫:一个m×n的网络,有很多墙壁,对前进方向形成了多处障碍。先通过某种方法获得到出口的路线,最短路线 示意图:以6×6网络为例解决方法: 回溯法 概念: 回溯法又称试探法;具体指一步一步向前试探,当某一步有多种选择时,可以先任意选择一种,只要这种选择暂时可行就继续向前,一旦发现到达某步后无法再继续前进,说明前面已经做的选择可能有问题,就可以后退,回到上一

2018-01-05 17:05:42 254

原创 【单链表面试题】------复杂链表的复制

问题描述: 一个链表的每一个节点,有一个指向next指向下一个节点,还有一个random指针指向这个链表中的一个随机节点或者NULL,现在要求实现复制这个链表,返回复制后的新链表 先来看复杂链表的结构(配图) typedef struct ComplexListNode { DataType _data; struct ComplexListNode* _nex

2017-12-31 15:51:33 284

原创 【单链表面试题】------链表相交问题

思考: 两个链表相交,其特点为两个链表共用一个尾;但这两个链表可分为以下两个情况: 情况1:两个链表不带环 情况2:两个链表可能带环其中情况2又可分为以下几种问题: 两个链表都不带环 和情况1是相同的(具体如图1) 一个链表带环,一个不带环 结论:一定不相交 两个链表都带环 a. 不相交 b. 相交 1)环内相交 ...

2017-12-30 21:24:49 399

原创 【单链表面试题】-----链表带环问题

判断单链表是否带环,并求得相遇点 思路:快慢指针问题,(前面已经讲过快慢指针原理,在这里不再详细描述) 当快指针比慢指针多走一步,在某个环内一定会相遇在某一点;反过来则有:当两个快慢指针在某一点相遇,这个链表一定是带环的链表,反之不带环(具体过程如图)具体代码://链表是否带环(并返回相遇点)SListNode* SListIsCircle(SListNode* list...

2017-12-30 19:30:51 269

原创 【单链表面试题】------快慢指针问题

快慢指针求解查找链表的某一节点(条件:只能遍历一次链表) 思路:没有只能遍历一次链表这个条件时,我们>通常想到的方法是遍历多次链表,但有了这个条>件,我们尝试同时用两个指针(即 fast 和 slow)来遍历链表,当这两个指针从链表的头走到尾时,两个指针走的步数相差某一值时便可达到目的1. 查找单链表的中间节点,要求只能遍历一次链表(具体过程如下图)分析:这里查找中间节点时,快指走 2 步,慢

2017-12-29 17:52:47 394

原创 【单链表面试题】------有序链表的合并

合并两个有序链表,合并后依旧有序(以升序为例) 两种算法 1)循环;从头到尾遍历两个链表,比较大小,将较小的数据拿下来尾插 2)递归代码:非递归://合并两个有序单链表,合并后依旧有序SListNode* SListCombineSort(SListNode* list1, SListNode* list2){ SListNode* cur1 ...

2017-12-29 16:45:31 219

原创 【单链表面试题】--------链表的逆置

逆置单链表 两种方法 1)利用头插法,和前面讲述的从尾到头是一个道理,不在做详细研究 2)三个指针翻转(具体过程如下图)代码:/*三个指针*/SListNode* ReverseList(SListNode* pHead){ SListNode* n1, *n2, *n3; if (pHead == NULL || pHead->_next == NULL)

2017-12-29 16:41:19 265

原创 【单链表面试题】------链表的打印,删除,插入

从尾到头打印单链表 几种方法: 1)头插法打印;将原有单链表进行头插,在将其新的链表打印出来(会重新开辟空间,故不建议这种做法) 2)递归法打印;当递归到链表的尾时,返回,并打印链表的数据 3)循环法打印;(过程如下图)代码: /*头插法*/void SListPrintBackToFront(SListNode* pHead){ asser...

2017-12-29 16:37:03 281

原创 字符串右移

字符串右旋题目描述: 请实现字符串右循环移位函数,比如:“abcdefghi” 循环右移2位就是“hiabcdefg” 函数原型: void RightLoopMove(char *pstr,unsigned short steps) 函数参数说明: pstr: Point to a ‘\0’ terminated string steps:

2017-12-29 16:25:41 1199

原创 链表的增、删、查、找

基本结构 typedef int DataType; typedef struct SListNode { struct SListNode* _next; DataType _data; }SListNode;链表结构分为两部分,一部分是数据域,存放的是节点的数据部分,另一部分是指针域,保存下一节点的地址新建节点 和动态顺序表不...

2017-12-20 21:01:32 248

原创 动态顺序表的增、删、查、找

顺序表 同数组一样,一段连续的空间,地址由低到高 分为静态顺序表和动态顺序表静态顺序表typedef int DataType; struct SeqList{ DataType _arr[100]; //顺序表的空间大小 int _size; //当前空间有效数据的大小 };动态顺序表typedef int DataType;struct Se

2017-12-16 21:56:42 304

原创 时间复杂度和空间复杂度

时间复杂度定义 一个函数,该函数计算的是执行基本操作的次数表示方法 —- O(N) 一般用 O(N)来表示算法的时间复杂度,N为函数中增长速率最快的表达式一般算法 O(N) 计算方法 忽略常数项,时间复杂度为O(1) 取最坏情况的时间复杂度和增长最快的表达式 递归算法的时间复杂度:递归总次数*每次递归次数几个例子例1: int mul(int n){ if

2017-12-07 20:45:46 228

原创 C 清空输入缓冲区,以及fflush(stdin)的使用误区和解决方法

对C 语言初学者来说,fflush(stdin)函数被解释为会清空输入缓冲区的一个系统函数,这是一个曾经几乎对过一半的说法,随着计算机科学的进步,在学习的过程中的逐步完善,将fflush(stdin)函数的过去与现在分析一下。Personal thinking:fflush(stdin) 会清空输入缓冲区中的内容,读取时输入缓冲区中的内容会被scanf函数逐个取走,正常case下sca

2017-12-05 16:43:39 2147 3

原创 c语言关键字(下)

1. unsigned 和 signed 首先来看各值的表示范围: 32 位 signed int 类型整数表示法范围:-2^31 ——2^31-1; 8 位 signed char类型数其值表示范围:-2^7—— 2^7-1; 32位 unsigned int 类型数表示法范围:0 —— 2^32-1; 8 位 unsigned char 类型数其值表示法范围:

2017-11-26 16:34:29 297

原创 使用qsort函数排序各类型数据

接前面模拟实现的 qsort 函数,我们知道qsort是通过回调函数来实现其功能,故而我们通过回调函数可以排序各种类型的数据代码#include<stdio.h>#include<stdlib.h>#include<search.h>#include<string.h>int cmp(const void *x,const void *y) //整型{ retu

2017-11-20 19:56:29 786

原创 小型计算器

思想: 利用转移表实现计算器功能,实现之前先来补充一下转移表知识转移表(函数指针数组) 将函数的地址存到一个数组中,那这个数组就叫函数指针数组,那函数指针的数组 如何定义呢? int (* parr1[10]])(); int* parr210; int (* )() parr3[10]; 答案是:parr1 parr1先和[]结合,说明parr1是数组,数组的内容

2017-11-20 11:22:59 407

原创 模拟实现库函数---qsort

实现功能之前,先补充一个知识:回调函数 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针 (地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。qsort函数:在上图中,我们可以看到,qsort的参数有函数指针 int(_cd

2017-11-19 17:01:10 228

原创 浅析指针数组、数组指针、函数指针、指针函数、函数指针数组的指针

1. 指针数组 两个例子: 1) int a[5]; 2) int *b[5]; 分析:根据前面数组的学习,我们知道数组的类型是int [5],显而易见(1)是一个数组,(2)是什么,指针还是数组?答案是数组,类型是int *[5],数组当中存放的都是指针。 我们知道,定义数组时,往往是在栈上提供一大块空间给数组存放内容,而对于指针而言,只占四个字节的空间;下面通过内存来证明一下两个都是

2017-11-19 14:37:24 270

原创 小游戏--三子棋(任意几子棋)

程序思想 1. 多文件实现游戏功能 2. 改变宏定义即可改变棋盘大小以及棋子个数 3. test.c:功能的测试以及函数的调用 4. game.h : 包含头文件的引用,函数的声明 5. game.c : 各函数的功能的实现。 具体实现 1. 棋牌的设置以及棋盘的显示 2. 玩家和电脑各自落子的实现 3. 输赢的判定代码:test.c#define _CRT_SECURE_NO_

2017-11-11 22:44:41 371

原创 斐波那契数列算法——递归与非递归

斐波那契数列: 斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n

2017-11-06 16:01:57 2405

原创 浅析可变参数列表及实例分析

实例分析之前先补充几个知识点 1.可变参数 C语言函数中,一些函数参数部分的个数是可变的,我们称之为可变参数,其函数称为可变函数;例如printf()函数,它的定义是这样的: int printf( const char *format [, argument]… ); 除了有一个参数format是固定的,后面跟着的参数个数和类型是可变的,例如: printf(“%d”

2017-11-05 17:40:13 330

转载 http协议中的1XX,2XX,3XX,4XX,5XX

转自:http://m.blog.csdn.net/blog/u013857407/21741847HTTP协议状态码,是指在HTTP协议运作中由客户端发出请求连接,服务端建立连接,客户端发出HTTP请求,服务端返回响应信息,而在这个过程张由于客户端或服务端的问题会返回相应的错误代码并显示给用户,对应的错误代码表示不同的错误信息,根据这个信息用户可以调整相应的操作来修改出现的错误,最终避免错误

2017-11-02 21:29:07 1255

原创 大小端介绍及其检测方法

大小端介绍大端存储 将一个数据的低字节序的内容存储到高地址处,高字节序的内容存储到低地址处。2.小端存储 将一个数据的低字节序内容存储到低地址处,将高字节序的内容存储到高地址处。检测方法算法一:取出一个整型数的地址,并拿出第一个字节判断是高字节序还是低字节序#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int check_sys(){

2017-11-02 20:57:45 367

原创 模拟实现库函数strlen

库函数 strlen 求字符串长度,当遇到‘\0’时,停止计算;关于这个函数的声明以及头文件,通过msdn了解一下: 首先分析一下实现过程: 首先给定字符串,必定占一定的内存空间,计算大小时,我们可以通过计数的方法来计算字符串的长度,每遇到一个字符,计数器加 1,直到遇到‘\0’停止计算。 下面实现自己的函数:#include<stdio.h>#include<assert.

2017-11-01 20:22:40 628

转载 函数的调用约定

转自:http://blog.csdn.net/Blue_Dream_/archive/2007/08/29/1763471.aspx 函数调用约定收藏新一篇: 函数名修饰约定规则 | 旧一篇: 构建自己的操作系统 1一:函数调用约定:函数调用约定是函数调用者和被调用的函数体之间关于参数传递、返回值传递、堆栈清除、寄存器使用的一种约定; 它是需要二进制级别兼容的

2017-10-29 21:13:26 383

原创 模拟实现库函数strcpy

库函数——strcpy 简单来说就是字符串的拷贝,对于这个函数返回类型、参数类型以及头文件,我们通过msdn来看一下:看了这个函数的相关知识,下来我们先分析一下他的实现过程: 首先要有一个字符串和一个目标空间,将字符串拷贝到目标空间时,我们可以通过指针来完成;定义指针变量分别指向目标空间的首地址以及字符串的首地址,逐一将字符串的内容放到数组当中,直到‘\0’结束。(注意:字符串拷贝过程中‘\0’

2017-10-29 21:07:39 655

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除