编程练习专题C/C++
编程题
Emily静
无愧于心
展开
-
经典C编程题
1.实现函数:对一个8bit数据(unsigned char类型)的指定位(例如第n位)的置0或者置1操作,并保持其他位不变, 函数原型:void bit_set(unsigned char *p_data,unsigned char position,int flag) 注:(p_data是指定的源数据,position是指定位(1-8);flag表示是置0还是置1操作)这道题画个结构图一目了原创 2017-09-11 21:09:47 · 449 阅读 · 0 评论 -
二叉树中序遍历的下一个节点
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针根据下面二叉树中序遍历的结果: 1>.NULL节点中序遍历的下一个节点为NULL; 2>.如果给定的节点pNode存在右子树,则中序遍历下一个节点是右子树的最左节点; 3>.如果给定节点pNode不存在右子树,pNode为其父节...原创 2018-08-22 21:27:45 · 963 阅读 · 0 评论 -
删除链表中重复的节点
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 struct ListNode { int val; struct ListNode *next; ListNode(int x) : ...原创 2018-08-22 19:56:35 · 407 阅读 · 0 评论 -
复杂链表的复制
复杂链表中每个节点不仅有指向下一个节点的next指针,还具有一个random指针指向任一个节点或者为空。 复制复杂链表的关键是复制好指针的指向问题,最能想到的思路就是先将链表的next进行复制之后,再根据每一个节点的random指针的指向再去原链表中去找对应的节点,这种思路是可以的,但是每访问一个节点都要去找random指向的节点时间复杂度为O(n2); 如果用一个哈希表将每个节点的ran...原创 2018-08-03 12:16:50 · 143 阅读 · 0 评论 -
利用快排对单向链表排序
利用快排对单向链表进行排序,左右指针法和挖坑法都是不能使用的,因为这两种方法都要从最后往前进行查找,但是链表是双向的,往前面走是不可能的,所以只能采用前后指针法。struct ListNode{ int _val; ListNode* _next; ListNode(const int x) :_val(x) , _next(NULL...原创 2018-08-02 17:08:08 · 1571 阅读 · 0 评论 -
用一个数组实现一个栈&&元素出栈,入栈的合法性
用一个数组实现一个栈 采用如下图示方法:以两头向中间增长,push的时候将插入的数据压入到size1或size2的位置,size1++,size2–;pop的时候刚好相反,size1–,size2++; 取top的时候需要判断size1大于0,size2是否越界,小于_capacity 因为这里使用数组进行实现的,会牵扯到扩容得问题,这里在扩容的时候需要新开辟一块新的空间,将size1大小的...原创 2018-08-05 10:16:07 · 1165 阅读 · 0 评论 -
输入一个链表,从尾到头打印链表每个节点的值
输入一个链表,从尾到头打印链表每个节点值从头开始打印链表很简单,新建一个节点让其指向链表的头节点,打印节点的数值,再去指向下一个节点,再打印节点值,直到节点为NULL。那么要是从尾到头打印链表节点值,遵循“先进后出”的原则,所以这里考虑用栈。 先一一遍历链表,遍历一个节点就将其压入栈,直到所有节点都入栈,再取栈顶元素并打印节点的值,知道栈为空。/*** struct ListNo...原创 2018-03-27 10:53:56 · 609 阅读 · 0 评论 -
重构二叉树(前序遍历和中序遍历)
二叉树的前序遍历是先遍历根节点,接着是左子树节点,最后是右子树节点,所以可以通过前序遍历确定树的根节点。 二叉树的中序遍历实现遍历二叉树的左子树节点,接着是根节点,最后是右子树节点,所以可以通过中序遍历找到根节点后,根节点左边的节点是左子树节点,根节点右边的节点是右子树节点。利用上述两个理论就可以在知道前序遍历和中序遍历的情况下重构二叉树。 给定一棵树的前序遍历序列:1,2,3...原创 2018-03-31 21:19:32 · 1168 阅读 · 0 评论 -
Top_K问题,堆排序
Top_K问题 简述:在大量数据中选出K个最大的或最小的。 以取K个最大数为例: 具体思路: 1. 将给定的数据的前K个元素压入到vector空间,对这K个数进行向下调整建小堆; 2. 再将堆顶元素和数组的其他元素进行比较,当堆顶元素小于数组中所取元素时,将所取数组元素入堆; 3. 再进行调整,直到数组所有元素都依次进行比较。//仿函数比较template<class T&...原创 2018-03-16 16:12:13 · 483 阅读 · 0 评论 -
数组查找
题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。给定一个二维数组,如下:首先我们肯定会想到每个元素遍历一遍进行查找,但是效率太低了,题目中已经说了二维数组是每一行从左向右依次递增,每一列从上往下依次递增,这样我们就可以从四个角找思路。 ~左上角和右下角,当目标数大于左上原创 2018-02-02 18:48:13 · 207 阅读 · 0 评论 -
如何判断是完全二叉树
完全二叉树:若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边。判断是否是完全二叉树的思路:当对一个二叉树进行遍历的时候,如果是完全二叉树当遇到空节点的时候整棵树的节点都已经全部遍历完,空节点会在遍历的末尾,所以只需要判断在遇到空节点的时候二叉树是否遍历结束即可。一.利用队列,进行层序遍历 1.根据层序遍历,遇到节点就压原创 2018-01-03 09:19:33 · 1229 阅读 · 0 评论 -
使用两个栈实现一个队列&&使用两个队列实现一个栈
使用两个栈实现一个队列队列的特点是先进先出,根据这个可以有如下示意图:栈s1用来入数据,栈s2用来出数据;当s1入数据之后需要判断s2是否为空,为空的时候才可以将栈s1中的数据压入进去,当栈s1为空的时候,将栈s2的数据输出,输出后数据的顺序和队列入栈出栈的效果相同。要实现一个队列就要实现其基本的接口: Push(入队列),Pop(出队列),Front(队头节点),Size(队列的元素个数),Em原创 2017-12-20 19:03:15 · 608 阅读 · 0 评论 -
实现一个出栈,入栈,返回最小值的操作的时间复杂度为O(1)的栈
栈的特点的是先进后出,这里实现的栈是在这个基础上加以特定的功能。用一个原生栈实现 这种方法需要_min来记录栈顶元素到栈底元素的最小值,每次入栈之前需要先比较入栈元素和_min的值,接着将它两依次入栈;出栈的时候需要每次Pop两次,并记录第二次的值,即为新栈出栈的元素顺序。根据上述方法将组数据 “9 2 2 6 3 3 1”入栈可得到下面的栈模型:从上面模型可以看出如果最小值出现过早的话,在接下来原创 2017-12-20 12:06:02 · 4227 阅读 · 0 评论 -
喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以买多少汽水
这道题主要是考察编程逻辑,一定要分清奇数个空瓶和偶数个空瓶,还有终止循环的条件。int main() { int _bottle = 0;//当空瓶为奇数个时,表示剩下的瓶子 int money = 20; int count = 0;//总共的汽水数 int bottle=0;//空瓶数 if (money > 0) {原创 2017-10-10 20:07:00 · 1218 阅读 · 0 评论 -
一个数组只有两个数字出现一次,其他数字都出现两次,找出这两个数
这道题根据异或运算的性质:任何数和自己异或都等于0。 用0依次和数组中的每个元素进行异或,出现两次的数字通过异或会相互抵消,最后剩下的就是只出现一次的数字。剩下的两个数不相等,异或的话至少有一位是为1的,二进制对应位也不相同。 1.得到0与数组中各元素依次异或的结果; 2.找到依次异或后的结果中为1的位置并标记,根据标记位是否为1进行分组; 2.将原数组分为两组,每组都含有一个只出现一次的...原创 2017-10-10 19:59:09 · 2141 阅读 · 5 评论 -
实现二分查找
所谓的二分查找就是用目标值先和有序数组中中间元素进行比较,如果目标值小于有序数组元素中间值,就接着访问左边数组元素,和左边数组中间元素比较;如果目标值大于有序数组元素中间值,就接着访问右边数组元素,和右边数组中间元素比较…… 二分查找代码如下:#include <stdio.h> int Binary_key(int arr[], int key, int left, int right)原创 2017-07-21 19:05:29 · 272 阅读 · 0 评论 -
实现猜数字游戏
猜数字游戏实际上就是先用rand函数给出随机目标值,然后用户键盘输入一个数进行比较,这里要用到if—else语句来完成,用while循环来让用户连续猜数,直到猜数成功。猜数字游戏代码如下:#include <stdio.h>#include <time.h>void menu(){ printf("^^^^^^^^^^^^1.play^^^^^^^^^^^^^^\n");原创 2017-07-21 19:34:48 · 967 阅读 · 0 评论 -
数组中重复的数字
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2思路:因为长度为n的数组的所有数组都是在0到n-1范围内,可以根据数组的下标将对应的数字进行对号入座,如果在对号入座...原创 2018-08-22 22:53:16 · 186 阅读 · 0 评论