摘要: /************************************************************************//* 写一个函数,它的原形是int continumax(char *outputstr,char *intputstr)功能:在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串付给其中一个函数参数outputstr 所指内存。例如:"abcd12345ed125ss123456789"的首地址传给intputstr 后,函数将返回9,outputstr 所指的值为123456789*//********* 阅读全文
posted @ 2012-08-28 16:22 夏日冰茶 阅读(460) 评论(0) 推荐(0) 编辑
摘要: 题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。 分析:这道题是2006年google的一道笔试题。 看到这道题时,最直观的想法是从头开始扫描这个字符串中的每个字符。当访问到某字符时拿这个字符和后面的每个字符相比较,如果在后面没有发现重复的字符,则该字符就是只出现一次的字符。如果字符串有n个字符,每个字符可能与后面的O(n)个字符相比较,因此这种思路时间复杂度是O(n2)。我们试着去找一个更快的方法。 由于题目与字符出现的次数相关,我们是不是可以统计每个字符在该字符串中出现的次数?要达到这个目的,我们需要 一个数据容器来存放每个字符的出现次数。在这个数据容器 阅读全文
posted @ 2012-08-25 10:40 夏日冰茶 阅读(12464) 评论(0) 推荐(0) 编辑
摘要: 要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字M,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。思路:(1)让指针指向数组的头部和尾部,相加,如果小于M,则增大头指针,如果大于则减小尾指针(2)退出的条件,相等或者头部=尾部算法:void function(int a[],int n,int M){ int i=0,j=n-1; while(i!=j){ if(a[i]+a[j]==M){ printf("%d,%d",a[i],a[j]); break; } a[i]+a... 阅读全文
posted @ 2012-08-24 20:12 夏日冰茶 阅读(539) 评论(0) 推荐(0) 编辑
摘要: 题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。#include<iostream>using namespace std;int mySum(int n){int temp=0;(!!n) && (temp=mySum(n-1));//n=0时,第一个条件为false,(temp=mySum(n-1))不会执行,因此不会再递归调用函数,递归结束。return temp+n;}int main(){int sum=mySum(100);cout<<sum< 阅读全文
posted @ 2012-08-24 19:54 夏日冰茶 阅读(156) 评论(0) 推荐(0) 编辑
摘要: 题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。分析:由于编写字符串相关代码能够反映程序员的编程能力和编程习惯,与字符串相关的问题一直是程序员笔试、面试题的热门题目。本题也曾多次受到包括微软在内的大量公司的青睐。由于本题需要翻转句子,我们先颠倒句子中的所有字符。这时,不但翻转了句子中单词的顺序,而且单词内字符也被翻转了。我们再颠倒每个单词内的字符。由于单词内的字符被翻转两次,因此顺序仍然和输入时的顺序保持一致。还是以上面的输 阅读全文
posted @ 2012-08-24 17:09 夏日冰茶 阅读(2281) 评论(0) 推荐(0) 编辑
摘要: 题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。 例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果: 8 / \ 6 10 / \ / \ 5 7 9 11因此返回true。如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。分析:这是一道trilogy的笔试题,主要考查对二元查找树的理解。在后续遍历得到的序列中,最后一个元素为树的根结点。从头开始扫描这个序列,比根结点小的元素都应该位于序列的左半部分;从第一个大于跟结点开始到跟结点前面的一个元素为止,所有元素都应该大于跟结 阅读全文
posted @ 2012-08-24 16:44 夏日冰茶 阅读(166) 评论(0) 推荐(0) 编辑
摘要: int isLoop(LinkList *L){ LinkList *fast,*slow; fast=slow=L; while (fast!=NULL&&fast->next!=NULL) { fast=fast->next->next; slow=slow->next; if (fast==slow) { return 1; } } return 0;} 阅读全文
posted @ 2012-08-24 15:58 夏日冰茶 阅读(123) 评论(0) 推荐(0) 编辑
摘要: 题目:输入n 个整数,输出其中最小的 k 个。例如输入 1 , 2 , 3 , 4 , 5 , 6 , 7 ,8 这 8 个数字,则最小的 4 个数字为 1 , 2 , 3 和 4 。分析:本题最简单也最容易想到的解决方法就是把输入的n个整数排序了。当然,排序也有好多种方法,是选择排序、插入排序、快速排序还是堆排序?如果是堆排序还要分为是用大根堆还是小根堆?首先,我们当然会选择时间复杂度较低(nlogn)的排序算法了。 再仔细看下题目,题中好像没有要求我们按大小顺序输出其中的最小的k个数!仅仅要求输入这个k个数而已。这就提示我们不必对所有数据进行排序,只需找出这k个最小数而已。是不是选择排序比 阅读全文
posted @ 2012-08-24 15:08 夏日冰茶 阅读(250) 评论(0) 推荐(0) 编辑
摘要: 题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如:输入的数组为1, -2, 3, 10, -4, 7, 2, -5,那么和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。分析:因为是O(N)的复杂度,因此需采用的DP的思想,记录下当前元素之和(为其最优状态,既最大),将其与目前所得的最大和比较,若大于则更新,否则继续。状态的累加遵循这个过 程:如果当前和小于0,则放弃该状态,将其归零。/** 求子数组的最大和* 利用的是DP(dynamic p... 阅读全文
posted @ 2012-08-24 15:04 夏日冰茶 阅读(163) 评论(0) 推荐(0) 编辑
摘要: 题目:在二元树中找出和为某一值的所有路径输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如输入整数22 和如下二元树 10 / \ 5 12 / \ 4 7则打印出两条路径:10, 12 和10, 5, 7。思路:1、当访问到某一节点时,把该结点的值添加到当前和变量,且把该结点压入栈中。2、若结点为叶子结点,且当前和变量==期望的和,则打印栈中的结点值,即为所需的路径。3、若结点不是叶子结点,继续访问它的左孩子结点,访问它的右孩子结点。4、删除该结... 阅读全文
posted @ 2012-08-24 14:59 夏日冰茶 阅读(127) 评论(0) 推荐(0) 编辑