- 博客(77)
- 资源 (1)
- 收藏
- 关注
原创 剑指Offer-动态规划 10- II. 青蛙跳台阶问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例 1:输入:n = 2输出:2示例 2:输入:n = 7输出:21示例 3:输入:n = 0输出:1提示:0 <= n <= 100把这个问题抽象出来:设跳上n级台阶有f(n)种跳法,最后一步只有2中情况要不是1级,要不是2级。当为1时,其他n-.
2021-04-02 17:41:11 261
原创 剑指Offer-动态规划 10- I. 斐波那契数列
剑指Offer-动态规划 10- I. 斐波那契数列写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:F(0) = 0,F(1)= 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例 1:输入...
2021-04-02 16:36:09 365
原创 LeetCode.7. 整数反转
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围[, − 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。示例 1:输入:x = 123输出:321示例 2:输入:x = -123输出:-321示例 3:输入:x = 120输出:21示例 4:输入:x = 0输出:0提示:<= x <= - 1这个题目是《剑指Offer-数据结构 ...
2021-04-01 18:22:53 237
原创 剑指Offer-数据结构 67. 把字符串转换成整数
剑指Offer-数据结构 67. 把字符串转换成整数写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,
2021-03-31 18:27:31 222
原创 剑指Offer-数据结构 59 - II. 队列的最大值
剑指Offer-数据结构 59 - II. 队列的最大值请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value需要返回 -1限制:1 <= push_back,pop_front,max_value的总操作数<= 100001 <= value <= 10^5这个题目其实就是窗口最大值的双向单调..
2021-03-26 18:09:52 146
原创 剑指Offer-数据结构 59 - I. 滑动窗口的最大值
剑指Offer-数据结构 59 - I. 滑动窗口的最大值Q:给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7]解释: 滑动窗口的位置 最大值--------------- -----[1 3 -1] -3 5 3 6 7 31 [3 -1 -3...
2021-03-24 14:00:43 285
原创 剑指Offer-数据结构 02. 左旋字符串
剑指Offer-数据结构 02. 左旋字符串Q: 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。示例 1:输入: s = "abcdefg", k = 2输出:"cdefgab"示例 2:输入: s = "lrloseumgh", k = 6输出:"umghlrlose"限制:1 <= k < s.l...
2021-03-18 17:05:16 129
原创 剑指Offer-数据结构 35. 复杂链表的复制
剑指Offer-数据结构35. 复杂链表的复制Q:请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。eg:输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]如果是复制一个普通的单链表,那很简单,依次创建节点,并设置next.
2021-03-18 15:15:51 166
原创 剑指Offer-数据结构 30. 包含 min 函数的栈
剑指Offer-数据结构 30. 包含 min 函数的栈Q:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 。示例:MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.min(); --> 返回 -3.minStack.pop();minSta.
2021-03-16 16:53:00 107
原创 剑指Offer-数据结构 24. 反转链表
剑指Offer-数据结构 剑指 Offer 24. 反转链表Q:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL限制:0 <= 节点个数 <= 5000这个题目在《C和指针》的学习部分已经详细分析了,请参考:《高频面试考点:反序排列单链表》,分析了4中不同的算法思路。这里..
2021-03-15 17:06:12 148
原创 剑指Offer-数据结构 20. 表示数值的字符串
剑指Offer-数据结构 53. 表示数值的字符串Q: 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、"5e2"、"-123"、"3.1416"、"-1E-16"、"0123"都表示数值,但"12e"、"1a3.14"、"1.2.3"、"+-5"及"12e+5.4"都不是。这种问题在实际开发过程中一般都不会有太大问题,因为有正则表达式来实现,但是正则表达式如何实现的呢?这就是这个题目在实际生产过程中解决的问题。这个题目有很多种情况,比如+-号只能在首位和
2021-03-15 16:51:14 126
原创 剑指Offer-数据结构 09. 用两个栈实现队列
剑指Offer-数据结构 09. 用两个栈实现队列Q:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead操作返回 -1 )示例 1:输入:["CQueue","appendTail","deleteHead","deleteHead"][[],[3],[],[]]输出:[null,null,3,-1]示例 2:输入:[.
2021-03-12 13:56:29 123
原创 剑指Offer-数据结构 06. 从尾到头打印链表
剑指Offer-数据结构 06. 从尾到头打印链表Q:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输入:head = [1,3,2]输出:[2,3,1]限制:0 <= 链表长度 <= 10000这个题目即使考察反转链表,反转链表之前我们有专门讲过,讲了4种方法,请参考《高频面试考点:反序排列单链表》实现示例:typedef struct NODE { struct NODE *link; int.
2021-03-11 16:01:58 111
原创 2007年美国M公司面试题
2007年11月美国著名软件企业M公司面试题下面程序哪一行会崩溃?struct S { int i; int *p;};int main() { struct S s; int *p = &s.i; p[0] = 4; p[1] = 3; s.p = p; s.p[1] = 1; s.p[0] = 2; return 0;}我们逐行分析一下:struct S s;int *p = &a..
2021-03-09 16:28:25 196 1
原创 ADT(抽象数据类型)--二叉树
二叉树是树的一种特殊形式,它的每个子节点至多具有2个孩子,分别是左孩子和右孩子,另外,每个节点的值比它的左子树的所有节点都大,但比它的右子树的所有节点都小,所以有了这个规则,树中就不会有重复的元素,这个特性也使二叉搜索树成为一种用关键值快速查找数据的优秀工具。...
2021-03-05 14:42:56 1679 1
原创 ADT(抽象数据类型)--队列
队列是先进先出,直接和排队类比即可,队列的实现较堆栈要麻烦一些,比如用静态数组来实现队列,每次移除数据后原来的位置就空起了,使用一个指针front指向队列头部,用另一个指针rear指向队列尾部,比如一个5个元素的数组,删除3个元素后,本来数组还可以继续存入3个元素,但那3个元素则无法再次利用了。为此,提出了环数组的概念:即当尾部下标移出数组时,就设置为0。front不再是固定的,而是跟随移除数据往后移动,front 和rear都是动态变化的,添加数据时rear也递增移动,删除数据时front向前移动
2021-03-03 17:03:27 525
原创 ADT(抽象数据类型)--堆栈
堆栈很简单,先进后出,用静态数组和动态内存分配实现:版本一:静态数组版本define STACK_SIZE 100typedef int STACK_TYPE;//堆栈数组static STACK_TYPE stack[STACK_SIZE];//栈顶offset indexstatic int top_element = -1;//pushvoid push(STACK_TYPE value) { assert(!is_full()); top_element +
2021-03-02 16:19:42 301
原创 C函数指针的常见2大应用:回调函数和转移表
函数指针在实际的代码中还是很常见,一般有2大应用:1、回调函数(Callback Functions)我们先看一下之前我们在链表中查找一个节点的做法:typedef struct NODE { int value; struct NODE *link;} Node;void display(Node *list) { Node *p = list; do { printf("%d ", p->value); } while(
2021-02-24 20:08:47 251
原创 用链表实现索引单词表
【12.8-7】编写一个函数,把一个新单词插入到问题7所描述的索引表中。函数接受两个参数,一个指向list指针的指针和一个字符串,该字符串假定包含单个单词,如果这个单词原先并未存在索引表中,它应该复制一块动态分配的节点并插入到这个索引表中,如果成功插入返回真,如果该字符原先已经存在于索引表中,或字符串不是以字符开头或其他错误返回假。函数应该维护一个一级链表,节点的排序以字母为序,其余的二级链表则以单词为序排列。第一步构建一个索引列表:typedef struct WORD { str
2021-02-24 15:03:49 632
原创 双链表删除节点
编写一个程序,从双链表中移除一个节点,函数的原型如下int dll_remove(struct NODE *rootp, struct NODE *node);你可以假设节点数据结构在头文件double_linked_list_node.h文件中定义,函数第一个参数是一个指向包含链表根指针的节点的指针,第二个参数是个指向欲移除的节点的指针,如果链表并不包含欲移除的指针,函数就返回假,否则函数移除该节点并返回真。遇到链表操作的题目,第一步就是画一个链表图,然后理清指针指向然后再转化成代码
2021-02-22 16:29:08 6583
原创 单链表移除节点
【12.8-5】编写一个程序,从一个单链表中移除一个节点,函数的原型如下:int sll_remove(struct NODE **rootp, struct NODE *node);你可以假设节点数据结构在头文件singly_linked_list_node.h中定义,函数的第一个参数是一个指向链表根指针的指针,第二个参数是一个指向欲移除的节点的指针,如果链表并不包含该指针,函数就返回假,否则它就移除这个节点并返回真,把一个欲移除的节点的指针而不是欲移除的值作为参数传递给函数有哪些优点?这个
2021-02-22 15:19:01 280 1
原创 高频面试考点:反序排列单链表
【12.8 4】编写一个函数,反序排列一个单链表中所有的节点。函数应该具有下面的原型:struct NODE *sll_reverse(struct NODE *first);在头文件singly_linked_list_node.h中声明节点数据结构。函数的参数指向链表的第一个节点。当链表被重排之后,函数返回一个指向链表新头节点的指针,链表最后一个节点的link字段的值应设置为NULL,在空链表(first == NULL)上执行这个函数将返回NULL。实现单链表的反转方法有很多种,这里就
2021-02-22 14:20:31 287
原创 双链表进化-实现一个最优的双链表插入算法
(注意:这里第一个结点的bwd为NULL,最后一个节点的fwd位NULL。)要将一个节点插入到双链表中,有几种情况:1、插入链表中间位置2、插入链表起始位置3、插入链表结束位置4、原链表为空,相当于既要插入起始位置,又插入结束位置。每种情况有4个指针必须修改:在1,2 两种情况下新节点fwd字段必须设置为指向链表的下一个节点,链表下一个节点的bwd字段必须指向这个新节点。在3,4两种情况下,新节点的fwd字段字段必须设置为NULL,根节点的fwd必须指向这个新节...
2021-02-19 13:36:51 269
原创 单链表进化-实现一个最优的单链表插入算法
实现如下有序的单链表:创建数据结构:typedef struct NODE { int value; struct NODE *link;} Node;版本一:int ssl_inset(Node *current, int new_value) { Node *previous; Node *new_node; while(current->value < new_value) { previous = cu
2021-02-18 18:01:16 380
原创 最简单的数据链表雏形
【11-4】编写一个程序,按照下图中的样子创建数据结构,最后三个对象都是动态分配的结构。第一个对象则可能是一个静态的指向结构的指针。你不必使这个程序过于全面--我们将在下一章讨论这个结构。这个题目就是定义一个最简单的数据链表,实际应用中我们会写大量类似的代码,在后面的链表结构的时候在重点讨论。typedef struct NODE { int value; struct NODE *next;} Node;Node *new_node(int value) { N
2021-02-09 17:37:27 150
原创 从标准输入读取字符串
【11-3】编写一个函数,从标准输入读取一个字符串,把字符串复制到动态内存分配的内存中,并返回该字符串的拷贝,这个函数不应该对读入字符串的长度作任何限制!这个问题比较简单,需要注意字符串输入的结束处理和内存空间的申请的时机。#include <stdio.h>#include <string.h>#include <assert.h>typedef short int int16_t;typedef int int32_t;#define TRU
2021-02-09 15:25:25 782 1
原创 从标准输入读取一系列数字的处理
【11-2】编写一个函数,从标准输入读取一列整数,把这些值存储于一个动态分配的数组中并返回这个数组,函数通过观察EOF判断输入是否结束,数组的第一个数是数组包含的值的个数,它的后面就是这些整数值。这个题目看起来很简单,但是有一个地方不好处理,scanf到达尾部EOF的时候才返回,那这些缓冲区的数据如何存储?这些缓冲区的数据包含了数组大小和实际的数据内容。...
2021-02-08 18:46:49 1101
原创 C语言结构体的位段替代方法
【10-11】如果不使用位段,你怎样实现下面这段代码的功能?假定你使用的是一台16位的机器,它从左向右为位段分配内存。struct { int a: 4; int b: 8; int c: 3; int d: 1;} x;....x.a = aaa;x.b = bbb;x.c = ccc;x.d = ddd;这个题目的思路很重要,特别是对嵌入式开发来讲,在C语言中,不管是什么结构,解析为内存地址映射后就比较好理解。比如这个题目这个结构体变量x,它
2021-02-05 18:14:21 406 1
原创 C语言结构体数组的指针运用
【10-7】考虑下面这些声明和数据。struct NODE{ int a; struct NODE *b; struct NODE *c;};struct NODE nodes[5] = { {5, nodes + 3, NULL}, {15, nodes + 4, nodes + 3}, {22, NULL, nodes + 4}, {12, nodes + 1, nodes}, {18, nodes + 2, nodes .
2021-02-05 15:02:54 636
原创 C实现有效位处理的通用字符串格式化
【9-17】这个程序与前两个练习类似,但更加一般化了,它允许调用程序把逗号放在大数的内部,去除多余的前导0以及提供一个浮动的美元符号等。这个函数的操作类似于IBM370机器上的Edit和Mark指令。它的原型如下:char *edit(char *pattern, char const *digits);它的基本思路很简单,模式(pattern)就是一个图样,处理结果看上去应该向它的样子。数字字符串中的字符根据这个图样所提供的方式从左向右复制到模式字符串。数字字符串的第一位有效数字很重要,结
2021-02-04 21:26:19 214 1
原创 C实现通用字符串格式化
【9-16】这个程序与前一个练习相似,但它更为通用。它按照一个指定的格式字符串对一个数字字符串进行格式化,类似许多BASIC编码器所提供的“print using”语句。函数的原型如下:int format(char *format_string, char const *digit_string);digit_string中的数字根据一开始在format_string中找到的字符从右到左逐个复制到format_string中。注意被修改后的format_string就是这个处理过程的结果,当你
2021-02-04 17:40:18 1631
原创 战争谍报加密算法
【9-12】有一种技巧可以对数据进行加密,并使用一个单词作为它的密钥。下面是它的工作原理:首先,选择一个单词作为密钥,如TRAILBLAZERS。如果单词中包含有重复的字母,只保留第一个,其余几个丢弃。现在,修改过的那个单词列于字母表的下面,如下所示:最后,底下那行字母表中剩余的字母填充完整(不能和前面的重复):在对信息进行加密时,信息中的每个字母被固定于顶上那行,并用下面那行的对应字母一一取代原文的字母。因此,使用这个密钥,ATTACK AT DAWN(黎明时攻击)就会被加密为TPPTAD
2021-02-02 22:03:11 733
原创 回文检测
编写函数int palindrome(char *string);如果参数字符串是个回文,函数就返回真,否则返回假。回文就是指一个字符串从左向右和从右向左读是一样的。函数应该忽略所有的非字母字符,而且在进行字符比较时不用区分大小写。其实回文本身的检测逻辑其实很简单,就是将一个指针指向最后,一个指针指向头部,不断靠近对比。但这个题目加了一些额外条件:1、忽略所有非字母字符2、忽略大小写大的检测逻辑没有变化,只是说判断的时候需要添加额外条件。#define TRUE 1#
2021-02-02 15:28:16 667
原创 实现查找字符指定第几次出现的函数my_strnchr
编写一个名叫my_strnchr的函数,它的原型如下:char *my_strnchr(char comst *str, int ch, int which);这个函数类似于strchr,但它的第三个参数指定ch字符在str字符串中第几次出现,例如,第三个参数为1,这个函数的功能就和strchr一样,如果参数为2,这个函数就返回一个指向ch字符在str字符串中第二次出现的位置的指针。char *my_strnchr(char const *str, int ch, int which)
2021-02-01 18:28:03 913
原创 实现字符串拷贝函数my_strcpy
【8-3】编写一个名为my_strcpy的函数,它类似与strcpy函数,但它不会溢出目标数组。复制的结果必须是一个真正的字符串。目标字符数组,是空的,要想保证其不溢出,有什么可以作为判断条件呢? 只有传入一个长度,也就是strncpy的实现。char * my_strcpy(char *dst, const char *src, int size) { strncpy(dst, src, size); *(dst + size - 1) = NUL; return ds
2021-02-01 16:54:13 814 1
原创 实现字符串长度函数my_strlen
【9-2】编写一个名叫my_strlen的函数,它类似与strlen函数,但它能够处理由于使用strn--函数而创建的未以NUL字节结尾的字符串。你需要向函数传递一个参数,它的值就是保存了需要进行长度测试的字符串的数组的长度。这个题目比较简单就2个条件:字符串以'\0'结束,或者到达了传入的len长度:#define NUL '\0'int my_strlen(char * str, int len) { int count = 0; while( *str++ != NU
2021-02-01 16:01:09 678
原创 strtok、strtok_r 、strsep函数的问题
首先看第一个strtok:虽然strtok有诸多问题,已经被Linux kernel淘汰,由strsep替代,但了解这个函数的实现对我们理解C语言的运用极有裨益,也有过知名企业的面试中甚至出现了strtok函数的实现考察。C 库函数 char *strtok(char *str, const char *delim) 分解字符串 str 为一组字符串,delim 为分隔符。这个函数陷阱很多,我们先看一下这个函数一个实现(来源于apple opensource):#include &l.
2021-01-27 17:52:04 738
原创 字符串查找strstr实现
通过对C的库函数strstr的实现,可以加深对字符串和指针的理解。函数定义:char * strstr (const char *s1, const char *s2)我们很容易就可以想到一个嵌套循环查找:版本一:外层循环用于定位在是s1中的查找起点,当内侧循环未完全匹配的时候,外侧循环的指针就后移一位,再次通过内侧循环测试。而内层循环一旦对应相等则不断比较测试后面的字符,直到s2子串的尾部,如果p2到达尾部说明完全相等。内层循环如果发现有不等的字符就跳出内层循环重新从s1的下一位开
2021-01-26 17:24:08 431
原创 八皇后问题
【8-8】皇后是国际象棋中威力最大的棋子,在下面所示的棋盘上,皇后可以攻击位于箭头所覆盖位置的所有棋子。我们能不能把8个皇后放在棋盘上,它们中任何一个都无法攻击其余的皇后?这个问题被称为八皇后问题,你的任务是编写一个程序,找到八皇后问题的所有答案,看看一共有多少种答案。提示:如果你采用一种叫做回溯法的技巧,就很容易编写出这个程序,编写一个函数,把皇后放在某行的第一列,然后检查它是否与棋盘上的其他皇后互相攻击,如果存在互相攻击,函数把皇后移到该行的第二列再进行检查,如果每列都存在互相攻击的情况,函
2021-01-25 17:51:35 674
原创 C语言虚拟伪数组
如你所知,C编译器为数组分配下标时总是从0开始,而且当程序使用下标访问数组元素时,它并不检查下标的有效性,在这个项目中,你将要编写一个函数,允许用户访问“伪数组”,它的下标范围可以任意指定,并伴以完整的错误检查。下面是你将要编写的这个函数的原型:int array_offset(int arrayinfo[],...);这个函数接受一些用于描述伪数组的维数信息以及一组下标值,使用这个函数,用户既可以以向量的形式分配内存空间,也可以使用mallco分配空间,但按照多维数组的形式访问这些空间,这个数
2021-01-21 19:46:37 872 3
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人