摘要:
输入一个正数n,输出所有和为n连续正数序列。 例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。 这题还比较简单,从头开始,少了就往后加,多了就往前减。代码如下: #include using namespace std; void print(const int &start, const int &end) { cou... 阅读全文
2011年3月15日
摘要:
输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。 如果按照常规的思路来解决这个问题:首先考虑如何计算一个数n中1的个数,我们可以采用类似于求二进制1的个数的求法,每次除,并取余,看看余是不是1来确定。这样总共的时间复杂度将是O(n),这样是有些慢的。 考虑,如果知道了n的1... 阅读全文
2011年3月13日
摘要:
输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列。因为可以有如下的push和pop序列:push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop... 阅读全文
摘要:
一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。求总共有多少总跳法,并分析算法的时间复杂度。 首先我们考虑最简单的情况。如果只有1级台阶,那显然只有一种跳法。如果有2级台阶,那就有两种跳的方法了:一种是分两次跳,每次跳1级;另外一种就是一次跳2级。现在我们再来讨论一般情况。我们把n级台阶时的跳法看成是n的函数,记为f(n)。当n>2时,第一次跳的时候就有两种不同的选择:一是第一次只跳1级... 阅读全文
摘要:
输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。 这个题非常简单,考的是位运算,我们每次向左移1位,判断最后一位是不是1就可以了。不多说了,代码如下:#include int count_one(int x){ int count = 0; while (x != 0) { if (x&1 == 1) count... 阅读全文
摘要:
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。 将一个字符串分成两部分和两个部分,在字符串上定义反转的操作,即把的所有字符反转(如,那),那么我们可以得到下面的结论:。显然我们这就可以转化为字符串的反转的问题了。 代... 阅读全文
2011年3月8日
摘要:
我们很容易想到递归和循环的方法,最快是O(n)的 对于O(lgn)的解法,我们要用到公式: f(n) f(n-1) 1 1 (n-1)f(n-1) f(n-2) = 1 0 a^n = a^(n/2)*a^(n/2) 或 a^[(n-1)/2]*a^[(n+1)/2] 代码就不写了,很水的 阅读全文
摘要:
小儿科,学C++的时候,老师就教过了,从略。 阅读全文
摘要:
题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。这题最简单的办法就是暴力法了。除了暴力法,就是找规律了,找规律的过程有点负责,最终的规律是:f(n,m) = [f(n-1,m) + m] % n 有了这个... 阅读全文
2011年3月7日
摘要:
题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。这是一道超级大水题,注意英文字符的话,最多只有256个,这样咱就可以很简单地统计每个字符出现的次数,其实对于这题来讲的话,咱其实都不用去统计出现的次数,每个字符用两个位来记录其状态就可以了。但是为了程序的简单,我们这里使用int来计数。 代码:View Code #include using namespace s... 阅读全文
摘要:
题目:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。例如输入 8 / 6 10 / / 5 7 9 11输出8 6 10 5 7 9 11。这题太水了,层次遍历,一个队列搞定,代码就不写了 阅读全文
摘要:
题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。例如输入: 8 / 6 10 / / 5 7 9 11输出: 8 / 10 6 / / 11 9 7 5这题相对很简单,没什么说的,直接代码了核心代码void BSTree::mir... 阅读全文
摘要:
题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。仔细想想,你会发现对于排好序的数组来说,直接贪心就可以了。最初我们找到数组的第一个数字和最后一个数字。当两个数字的和大于输入的数字时... 阅读全文
摘要:
题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。 这题可以使用两个指针,第一指针首先向后找k个节点,然后两外一个指针同步开始向后,当第一个到最后时,第二个指针就指向了倒数第k个节点。 废话少说,上码:View Code #pragma once#include using namespace std;template class List;template ... 阅读全文
2011年3月5日
摘要:
题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。通常求1+2+…+n除了用公式n(n+1)/2之外,无外乎循环和递归两种思路。由于已经明确限制for和while的使用,循环已经不能再用了。同样,递归函数也需要用if语句或者条件判断语句来判断是继续递归下去还是终止递归,但现在题目已经不允许使用这两种语句了。... 阅读全文
2011年3月4日
摘要:
题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果: 8 / 6 10 / / 5 7 9 11因此返回true。如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。 这题其实很简单,我... 阅读全文
摘要:
题目:输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。不多说了,这个题是一个老题了,最简单的办法就是用大顶堆了,每次遍历数组与堆顶元素进行比较,如果比堆顶小,就替换堆顶,继续调整为大顶堆。 代码如下:View Code #pragma once#include using namespace std;template class... 阅读全文
2011年3月2日
摘要:
题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如输入整数22和如下二元树 10 / 5 12 / 4 7则打印出两条路径:10, 12和10, 5, 7。想想其实把所有的路径找出来,然后求和去算就可以解决。但是针对这题,有些路径可以在完全找出来之前就否定了……所以需要剪枝。利用递归的思想:... 阅读全文
摘要:
题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。 请参考:http://www.cnblogs.com/youwang/arc... 阅读全文
2011年3月1日
摘要:
题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。 分析:这题的主要限制在时间复杂度为O(1),首先想到的肯定是以空间换时间。这里我们给栈里面的每个元素,若是最小元素,就让他带一个指向上一个最小元素的域,这样就很容易就实现了。 以下是代码View Code #pragma oncetemplate class stac... 阅读全文