编程之美
文章平均质量分 56
Fivesplus
这个作者很懒,什么都没留下…
展开
-
圆圈中最后剩下的数字
题目:0.1....n-1这n个数字排成一个圆圈 从数字0开始每次从这个圆圈里删除第m个数字 求出这个圆圈里剩下的最后一个数字int lastnum( int n, int m){ if (n < 1 || m < 1) return false; list Listnum; for (int i = 0;i < n;i++) Listnum.push_back原创 2015-06-16 15:05:48 · 339 阅读 · 0 评论 -
二叉树中和为某一值的路径
题目:输入一颗二叉树和一个整数 打印出二叉树中结点值的和为输入整数的所有路径 从输的根节点开始往下一直到叶节点所经过的节点构成一条路径二叉树的定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode *m_pLeft; BinaryTreeNode *m_pRight;};当用前序遍历方式访问到某一个结点时 我们原创 2015-06-11 11:20:44 · 370 阅读 · 0 评论 -
顺时针打印矩阵
题目:输入一个矩阵 按照从外向量以顺时针的顺序依次打印出每一个数字 #include using namespace std;int main(){ int n; cin>>n; int **A=(int **)malloc(sizeof(int *)*n); for(int i=0;i<n;i++) A[i]=(int *)malloc(sizeof(int )*原创 2015-06-10 20:40:28 · 359 阅读 · 0 评论 -
包含min函数的栈
题目:定义栈的数据结构 请在该类型中实现一个能够得到栈的最小值的min函数 在该栈中 调用min、push及pop的时间复杂度都是O(1)#include #include #include using namespace std;template struct stackmin{ stack s1; stack s2; void push(T a); void p原创 2015-06-10 20:42:26 · 284 阅读 · 0 评论 -
从上往下打印二叉树
题目:从上往下打印出二叉树的每个结点 同一层的结点按照从左到右的顺序打印从上到下从左到右即层次遍历二叉树void visit(BinaryTreeNode *root){ if(root!=NULL) { s.push(root); BinaryTreeNode *t=NULL; while(s.size()) { t=s.front();原创 2015-06-11 09:54:40 · 353 阅读 · 0 评论 -
栈的压入、弹出顺序
题目:输入两个整数序列 第一个序列表示栈的压入顺序 请判断二个序列是否为该栈的弹出顺序。假设压入展的所有数字均不相同 例如序列1/2/3/4/5是某栈的压栈序列 序列4、5/3/2/1 是该压栈序列对应的一个弹栈序列 但4、3、5、1、2就不是#include #include using namespace std;stack s;bool Isoroder(int *A原创 2015-06-10 21:07:38 · 347 阅读 · 0 评论 -
Reservoir Sampling
蓄水池算法~~~原创 2015-06-10 23:15:49 · 332 阅读 · 0 评论 -
二叉搜索树与双向链表
题目:输入一颗二叉搜索树 将该二叉搜索树转换成一个排序的双向链表 要求不能创建任何新的结点 只能调整树中及诶单指针的指向二叉树结点定义如下:BinaryTreeNode* bulidlist(BinaryTreeNode *root){//返回的是链表的尾结点 if (root==NULL) return; if(root->m_pLeft==NULL && root->m_pR原创 2015-06-11 14:26:45 · 371 阅读 · 0 评论 -
字符串的排列
题目:输入一个字符串 打印出该字符串中字符的所有排列 例如输入字符串abc 则打印出由字符a、b、c所能排列出来的所有字符串打印abc 所有排列组合可以将第一位看做为a.然后分别于剩余的两位b、c进行交换得到bac bca 接着对只有两位的字符串进行交换 将第一位于剩余的位进行交换因此 递归的将第一位与其余位进行交换#include #include using原创 2015-06-11 14:27:28 · 388 阅读 · 0 评论 -
数组中出现次数超过一半的数字
题目: 数组中有一个数组出现的次数超过数组长度的一半 请找出这个数字解法1:最直观的方法是对数组进行排序 如果排好序就很容易计算出每个数字出现的次数 排序的时间复杂度为O(nlogn) 解法2: 如果对这个数组排序 要找出出现次数超过数组长度一半的数字 这个输液就是长度为n的数组第n/2大的数字 即中位数 可以用快速排序的方法找出任意第K大的数字 算法复杂度为原创 2015-06-12 15:51:15 · 420 阅读 · 0 评论 -
最小的K个数
题目:输入n个整数 找出其中最小的K个数 例如输入 4 5 1 6 2 7 3 8 这8个数字 最小的4个数字是 1 2 3 4解法1:排序 算法的时间复杂度为O(nlogn)解法2:快速排序 查找第k个大的数 算法的时间复杂度为O(logn)#include #include using namespace std;int partion(int原创 2015-06-12 16:51:31 · 309 阅读 · 0 评论 -
把数组排成最小的数
题目:输入一个正整数数组 把原创 2015-06-13 18:03:55 · 304 阅读 · 0 评论 -
丑数
题目:把只包含因子2、3和5的数称作丑数 求按从小到大的顺序的第1500个丑数(第一个丑数为1)从1 开始遍历 每一个数 若n因式分解只包含2、3、5这三个因子,即使n%2 n%3 n%5最后余数为0 则说明n为丑数这样做会导致1500个丑数之前的每个数都需要遍历---------------------------------分析:第一个丑数为1 接着为2,3,4,5,6,。原创 2015-06-14 11:00:45 · 390 阅读 · 0 评论 -
第一个只出现一次的字符
题目:在字符串中找出第一个只出现一次的字符 如输入“abaccdeff" 则输出‘b'从前向后遍历每一个字符 然后将当前字符与后面的每个字符比较 如果发现没有重复的字符则该字符就只出现一次 时间复杂度为O(n*n)我们可以统计每个字符出现的次数 需要一个数据容器来统计每个字符的出现次数 #include #include using namespace std;i原创 2015-06-14 11:10:03 · 340 阅读 · 0 评论 -
快速寻找满足条件的两个数
快速找出一个数组中的两个数字 让这两个数字之和等于一个给定的数字(假设这个数组中肯定存在这样一组或以上的数方法一:穷举法: for(int i=0;i<n;i++) { for(int j=i;j<n;j++) { if (a[i]+a[j]==m) cout<<a[i]<<' '<<a[j]<<endl; } }算法时间复杂度为O(N*N)原创 2015-05-19 15:25:03 · 614 阅读 · 0 评论 -
数字在排序数组中出现的次数
题目:统计一个数字在排序数组中出现的次数 列如输入排序数组{1 2 3 3 3 3 4 5}和数字3 输出4排序数组 可以用二分查找 查找输入的数字在数组中第一次出现的位置以及最后一次出现的位置#include using namespace std;int find1(int *A, int a, int b, int num){ if (a > b)原创 2015-06-15 20:39:56 · 345 阅读 · 0 评论 -
二叉树的深度
题目:输入一颗二叉树的根结点 求该树的深度 从根结点到叶节点一次经过的节点(含根、叶结点)形成树的一条路径 最长路径为树的深度二叉树的节点定义如下:typedef struct BinaryTreeNode{int m_nValue;BinaryTreeNode* m_pLeft;BinaryTreeNode* m_pRight;};int max(int a, int b)原创 2015-06-15 21:01:36 · 390 阅读 · 0 评论 -
翻转单词顺序VS左旋转字符串
题目:输入一个英文句子 翻转句子中单词的顺序 但单词内字符的顺序不变 为了简单起见 标点符号和普通字母一样处理例如“I am a student. " 则输出”student. a am I"思路:先翻转句子 再翻转句子中的每个单词 #include using namespace std;void reserve(char *start, char原创 2015-06-15 22:45:21 · 393 阅读 · 0 评论 -
二叉搜索树的后续遍历序列
题目:输入一个整数数组 判断该数组是不是某二叉搜索树的后续遍历结果 如果是则返回true 否咋返回false 假设输入数字的任意两个数字都互不相同后序遍历是左->右->根 左数组最后一个值t为根结点的值数组中小于t的为树的左孩子 之后的应当为右孩子 且所有的右孩子大于根t 若存在不大于t的值 则表明不是二叉搜索树的后序遍历顺序然后递归判断左孩子和右孩子是原创 2015-06-11 11:19:41 · 314 阅读 · 0 评论 -
树的子结构
题目:输入两颗二叉树A和B 判断B是不是A的子结构 二叉树结点定义如下;首先 从树根开始遍历树如果结点与 B的根结点值相同 则继续遍历A的左子树 以及B的左子树 如果左子树相同则遍历A的右子树以及B的左子树 如果左右子树都相同则 A包含B如果结点与B的根节点值不同 则遍历到A的左孩子 重复上述判断做孩子是否含有B 如果左子树不含有B 则遍历到A的右子树 判断其是否含有B原创 2015-06-10 16:48:40 · 333 阅读 · 0 评论 -
合并两个排序的链表
题目:输入两个递增排序的链表 合并这两个链表并使心里暗标中的结点仍然是按照递增的排序 链表结点的定义如下:struct ListNode{int m_nValue;ListNode *m_pNext;};#include using namespace std;struct ListNode{int m_nValue;ListNode *原创 2015-06-10 16:04:23 · 448 阅读 · 0 评论 -
n个骰子的点数
题目:把n个骰子扔在地上 所有骰子朝上一面的点数之和为s 输入n 打印出s的所有可能出现的概率思路:将n个骰子分为两堆 第一堆只有一个 另一个有n-1个 单独的那一个有6中可能 需要计算从1到6的每一种点数 和剩下的n-1个骰子 来计算点数 和 接下来把剩下的n-1个骰子还是分成两堆 第一堆只有一个 第二堆有n-2个 把上一轮单独骰子的点数和这一轮单独骰子点数相加 再和剩下的n-原创 2015-06-16 11:54:58 · 353 阅读 · 0 评论 -
扑克牌的顺子
题目:从扑克牌中随机抽5张牌 判断是不是一个顺子即这5张牌是不是连续的 2-10为数字本身 A为1 J为11 Q为12 K为13 而大小王可以看成任意数字思路:可以把5张牌看成由5个数字组成的数组 大小王是特殊的数字 不妨把它定义为0 接下来就是怎么判断这5个数字是否连续 可以用排序的方法由于0可以当做是任意数字 可以用0去补满数组中的孔雀 如果排序后的数组不是连续原创 2015-06-16 14:51:06 · 496 阅读 · 0 评论 -
求1+2+...+n
题目:求1+2+。。+n 要求不能使用乘除法 for while if else switch case等关键字及条件判断语句 (A?B:C)思路1:定义一个类型 接着创建n个该类型的实例 那么这个类型的构造函数将确定会被调用n次将累加相关的代码放到构造函数中#include using namespace std;class Temp {private:原创 2015-06-16 17:10:41 · 488 阅读 · 0 评论 -
一摞烙饼的排序
假设有n块大小不一的烙饼 那最少要翻几次 才能达到最后大小有序的结果?为了把最大的烙饼摆在最下面 先把最上面的烙饼和最大的烙饼之间的烙饼翻转 这样最大的烙饼就在最上面了 接着 把所有烙饼翻转 最大的烙饼就摆在了最下面之后我们队上面n-1、n-2个饼重复这个过程两次翻转就可以把最大的烙饼翻转到最下面 最多需要把上面的n-1个烙饼一次翻转两次 因此 最多需要2(n-1)次翻原创 2015-05-30 22:13:15 · 491 阅读 · 0 评论 -
赋值运算符函数
题目:如下为类型CMyString 的声明 请为该类型添加赋值运算符函数class CMyString{public: CMyString (char *pData=NULL); CMyString (const CMyString & str); CMyString & operator=(const CMyString &str) ; ~CMyString(void);pr原创 2015-06-05 22:12:15 · 302 阅读 · 0 评论 -
二维数组中的查找
题目:在一个二维数组中 每一行都按从左到右递增的顺序排序 每一列都按照从上到下递增的顺序排序 请完成一个函数 输入这样一个二维数组和一个整数 判断数组中是否含有该整数128924912471013681115假设要查找的是7 如上图的一个二维数组 每一行从左到右递增原创 2015-06-06 13:27:48 · 301 阅读 · 0 评论 -
替换空格
题目:请实现一个函数 把字符串中的每个空格替换成“%20”,例如输入“we are happy."则输出”we%20are%20happy."从前向后 可以遍历字符串遇到空格则将空格后的字符移动两位并替换为%20 但是这种方法时间复杂度为O(N*N)从后向前?遍历一遍字符串可以知道字符串中空格的个数 比如“we are happy."中 字符串长度为14(包括结原创 2015-06-06 14:04:32 · 387 阅读 · 0 评论 -
从尾到头打印链表
题目:输入一个链表的头结点 从尾到头反过来打印出每个结点的值从头到尾遍历链表 然后将遍历结果压入栈 最后弹出栈的顺序即为从尾到头遍历顺序 while(p!=NULL) { s.push(p); p=p->m_pNext; } while(s.size()) { coutm_nKey<<' '; s.pop(); }假设链表结点为原创 2015-06-06 14:20:49 · 304 阅读 · 0 评论 -
重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果 请重建出该二叉树 假设输入的前序遍历和中序遍历的结果中都不含重复的数字 例如输入的前序遍历{1,2,4,7,3,5,6,8,}和中序遍历{4,7,2,1,5,3,8,6} 则重建出来的二叉树如图所示 并输出他们的头结点 二叉树的节点定义如下struct BinaryTreeNode{ int m_nValue; B原创 2015-06-06 16:58:05 · 391 阅读 · 0 评论 -
用两个栈实现队列
题目:用两个栈实现一个队列 队列的声明如下 请实现它的两个函数appendTail 和deleteHead 分别完成在队列尾部插入结点和队列的头部删除结点的功能栈中元素先进后出 队列中元素先进先出 假设队列q ,元素1 2 3 先后进入队列 123 如果栈s1 中 1 2 3 先后进入栈原创 2015-06-06 17:08:34 · 386 阅读 · 0 评论 -
斐波那契数列
题目:写一个函数 输入n 求斐波那契数列的第n项 斐波那契数列定义如下: f(n)=0 n=0f(n)=1 n=1f(n)=f(n-1)+f(n-2) n>1原创 2015-06-09 10:15:00 · 448 阅读 · 0 评论 -
旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾 称之为数组的旋转 输入一个递增排序的数组的一个旋转 输出旋转数组的最小元素例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转 该数组最小元素为1#include using namespace std;int a[]={3,4,5,1,2,3};int n=5;int findbyorder(int *a,int low,i原创 2015-06-09 10:09:18 · 350 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组 实现一个函数用来调整该数组中数字的顺序 使得所有奇数位于数组的前半部分 偶数位于数组的后半部分#include using namespace std;void exchange(int *a,int n){ int low=0; int high=n-1; int t=0; if(a==NULL || n==0) throw std::exc原创 2015-06-09 16:44:54 · 332 阅读 · 0 评论 -
数值的整数次方
题目:实现函数double power(double base,int exponent),求base的exponent次方 不得使用库函数 同时不需要考虑大数问题考虑到base 为0 或者指数为0时 无意义base为1时返回base 指数为负数时返回 倒数 bool equal(double n1,double n2)//浮点数比较大小~~~~{ if(abs(n1-n2)原创 2015-06-09 11:00:48 · 319 阅读 · 0 评论 -
打印1到最大的n位数
题目:输入数字n 按顺序打印出从1最大的n为十进制数 比如输入3 则打印出1 2 3 一直到最大的3位数即999考虑到大数 应当使用字符串打印数字 何时打印停止 可以使用strcmp与n位最大的数9999...9比较 但每次比较时间复杂度为O(N)只有999....9加1时高位才会产生进位 因此可以判断最高位是否有进位来控制打印停止bool isov原创 2015-06-09 16:14:44 · 378 阅读 · 0 评论 -
二叉树的镜像
题目:请按成一个函数 输入一个二叉树 该函数输出它的镜像二叉树结点的定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode * m_pLeft; BinaryTreeNode * m_pRight;};先序遍历二叉树 如果该结点不是叶子结点 则交换其左右孩子 当交换完所有非叶子结点 就得到了镜像的二叉树原创 2015-06-10 17:01:04 · 350 阅读 · 0 评论 -
反转链表
题目:定义一个函数 输入一个链表的头结点 翻转该链表并输出翻转后链表的头结点 链表定义如下struct ListNode{int m_nValue;ListNode *m_pNext;}ListNode*reserve(ListNode *Lhead){ if(Lhead==NULL) { throw std::exception("Error ~!");原创 2015-06-10 15:21:49 · 301 阅读 · 0 评论 -
判断两个链表是否相交
给出两个单行链表的头指针 判断这两个链表是否相交 为了简化 这里假设两个链表均不带环方法1:判断第一个链表的每个节点是否在第二个链表中 这种方法的时间复杂度为O(lenth(l1)*lenth(l2))方法2:如果两个链表相交 那么这两个链表就会有共同的节点 而节点地址又是节点的唯一标识 所以我们能够判断两个链表是否有存在地址一致的节点 就可以判断两个链表是否相交原创 2015-05-21 16:54:11 · 397 阅读 · 0 评论