摘要: 转自:http://blog.csdn.net/bingxuewujian/article/details/6089640题目:输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。分析:这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的k个数就是最小的k个数。只是这种思路的时间复杂度为O(nlogn)。我们试着寻找更快的解决思路。我们可以开辟一个长度为k的数组。每次从输入的n个整数中读入一个数。如果数组中已经插入的元素少于k个,则将读入的整数直接放到数组中。否则长度为k的数组已经满了,不能再往数组里插入元素,只能替换 阅读全文
posted @ 2012-10-02 21:31 logzh 阅读(211) 评论(0) 推荐(0) 编辑
摘要: 题目:略分析:考虑二元查找树的后序遍历结果最后一位必是根节点,序列的前部分为树的左子树,后部分为右子树,其中左子树上的节点值都小于根节点的值,右子树上的节点值都大于于根节点的值。这样就成了一个 递归的操作。即把序列按照比根节点大小的关系分为左右两个部分,我们递归确认左右两部分是不是二元查找树的后序遍历结果即可。代码:int VertifySquenceOfBst(element list[], int length){ if(list ==NULL || length<=0) { return 0; } int i=0; int j=0; el... 阅读全文
posted @ 2012-10-02 21:20 logzh 阅读(207) 评论(0) 推荐(0) 编辑
摘要: 题目:输入一个英文句子,反转句子中单词的顺序,但是单词内字符顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字幕一样处理。分析:首先反转句子,再逐个单词反转。代码:注意while循环中对指针的操作;注意const在此处的用处;程序员面试题100题第21题——左旋转字符串char* ReverseString(char * const pStart, char * const pEnd)//反转字符串{ char *pS=pStart; char *pE=pEnd; if(pS != NULL && pE != NULL) { char temp... 阅读全文
posted @ 2012-10-02 20:57 logzh 阅读(241) 评论(0) 推荐(0) 编辑
摘要: 分析:维持两个指针,第一个指针从链表的头指针开始遍历,在第k-1步前,第二个指针保持不动;第k-1步开始,第二个指针也开始一起遍历。这样两个指针之间的距离保持k-1;当第一个指针到达尾结点时,第二个指针正好遍历到倒数第k个结点。代码:略 阅读全文
posted @ 2012-10-02 19:41 logzh 阅读(232) 评论(0) 推荐(0) 编辑
摘要: LinkList.h#ifndef LINKLIST_H#define LINKLIST_Htypedef int element;typedef struct ListNode{ element data; ListNode* next;}LNode;//初始化一个空链表void InitLinkList(LNode* *head);//计算链表的长度int LinkListLength(LNode* head);//插入操作:在位置i插入结点,结点数据为xbool InsertLinkList(LNode* head,int i, element x);//插入操作:在链表后依... 阅读全文
posted @ 2012-10-02 19:29 logzh 阅读(259) 评论(0) 推荐(0) 编辑
摘要: 解:从数组两端向数组的中间扫描。代码:略。 阅读全文
posted @ 2012-10-02 19:24 logzh 阅读(153) 评论(0) 推荐(0) 编辑
摘要: 题目:求二元查找树的镜像(即交换左右子树),递归+迭代分析:其实操作和前序二叉树类似。void Mirror(TreeNode *root)//递归互换左右子树{ if(root == NULL) return ; TreeNode* p=root->leftChild; root->leftChild =root->rightChild; root->rightChild=p; //swap if(root->leftChild != NULL) Mirror(root->leftChild); if(root->righ... 阅读全文
posted @ 2012-10-02 17:13 logzh 阅读(216) 评论(0) 推荐(0) 编辑
摘要: 题目:略分析:即层序遍历二叉树;参考二叉树的基本操作 阅读全文
posted @ 2012-10-02 16:55 logzh 阅读(152) 评论(0) 推荐(0) 编辑
摘要: tree.h#ifndef TREE_H#define TREE_H#include <assert.h>typedef int element;/*定义二叉树*/typedef struct Node{ element data; Node* leftChild; Node* rightChild;}TreeNode;void PreOrder(TreeNode *root);//递归前序遍历void InOrder(TreeNode *root);//递归中序遍历void PostOrder(TreeNode *root);//递归后序遍历void IterationPr... 阅读全文
posted @ 2012-10-02 16:42 logzh 阅读(326) 评论(0) 推荐(0) 编辑
摘要: 题目:在一个字符串中找到第一个只出现一次的字符。分析:此类题型需要建立对应的hash字符数组,空间换时间; 对于指针切记要检查是否为NULL, 对于while循环不要忘记++或--代码:char FindFirstNotRepeatChar(char* pStr){ unsigned int arr[256]={0};//建立对应字符的hash数组 char* p=pStr; if(p==NULL) { return 0; } while(*p != '\0') { arr[*p]++;//计数, p++;... 阅读全文
posted @ 2012-10-02 16:14 logzh 阅读(199) 评论(0) 推荐(0) 编辑
摘要: 题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。分析:既然题目有一个数字圆圈,很自然的想法是我们用一个数据结构来模拟这个圆圈。在常用的数据结构中,我们很容易想到用环形列表。我们可以创建一个总共有m个数字的环形列表,然后每次从这个列表中删除第m个元素。在参考代码中,我们用STL中std::list来模拟这个环形列表。由于list并不是一个环形的结构,因此每次跌代器扫描到列表末尾的时候,要记得把跌代器移到 阅读全文
posted @ 2012-10-02 15:50 logzh 阅读(301) 评论(0) 推荐(0) 编辑
摘要: 题目:定义Fibonacci数列f(1)=0;f(2)=1;...f(n)=f(n-1)+f(n-2);输入n,用最快的方法求该数列的第n项;分析:略代码:struct Matri2By2//定义2*2矩阵{ Matri2By2(unsigned long m00, unsigned long m01, unsigned long m10, unsigned long m11):m_00(m00),m_01(m01),m_10(m10),m_11(m11) {};//结构体的构造函数 unsigned long m_00; un... 阅读全文
posted @ 2012-10-02 15:15 logzh 阅读(381) 评论(0) 推荐(0) 编辑
摘要: 题目:把输入的字符串转化为整数,如:“-456” 输出456、“+456”输出456,“456”输出“456”,如果是非法输入,则输出0,并提示错误。代码:long long strToNum( const char* pStr){ long long num=0; int flag=1; if(pStr==NULL) { cout << "is null!\n"; return 0; } if(*pStr=='-') { flag=-1; pStr++; }else if(... 阅读全文
posted @ 2012-10-02 10:58 logzh 阅读(270) 评论(0) 推荐(0) 编辑