摘要:
要求时间复杂度是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... 阅读全文
摘要:
题目:求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< 阅读全文
摘要:
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。分析:由于编写字符串相关代码能够反映程序员的编程能力和编程习惯,与字符串相关的问题一直是程序员笔试、面试题的热门题目。本题也曾多次受到包括微软在内的大量公司的青睐。由于本题需要翻转句子,我们先颠倒句子中的所有字符。这时,不但翻转了句子中单词的顺序,而且单词内字符也被翻转了。我们再颠倒每个单词内的字符。由于单词内的字符被翻转两次,因此顺序仍然和输入时的顺序保持一致。还是以上面的输 阅读全文
摘要:
题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。 例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果: 8 / \ 6 10 / \ / \ 5 7 9 11因此返回true。如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。分析:这是一道trilogy的笔试题,主要考查对二元查找树的理解。在后续遍历得到的序列中,最后一个元素为树的根结点。从头开始扫描这个序列,比根结点小的元素都应该位于序列的左半部分;从第一个大于跟结点开始到跟结点前面的一个元素为止,所有元素都应该大于跟结 阅读全文
摘要:
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;} 阅读全文
摘要:
题目:输入n 个整数,输出其中最小的 k 个。例如输入 1 , 2 , 3 , 4 , 5 , 6 , 7 ,8 这 8 个数字,则最小的 4 个数字为 1 , 2 , 3 和 4 。分析:本题最简单也最容易想到的解决方法就是把输入的n个整数排序了。当然,排序也有好多种方法,是选择排序、插入排序、快速排序还是堆排序?如果是堆排序还要分为是用大根堆还是小根堆?首先,我们当然会选择时间复杂度较低(nlogn)的排序算法了。 再仔细看下题目,题中好像没有要求我们按大小顺序输出其中的最小的k个数!仅仅要求输入这个k个数而已。这就提示我们不必对所有数据进行排序,只需找出这k个最小数而已。是不是选择排序比 阅读全文
摘要:
题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如:输入的数组为1, -2, 3, 10, -4, 7, 2, -5,那么和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。分析:因为是O(N)的复杂度,因此需采用的DP的思想,记录下当前元素之和(为其最优状态,既最大),将其与目前所得的最大和比较,若大于则更新,否则继续。状态的累加遵循这个过 程:如果当前和小于0,则放弃该状态,将其归零。/** 求子数组的最大和* 利用的是DP(dynamic p... 阅读全文
摘要:
题目:在二元树中找出和为某一值的所有路径输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如输入整数22 和如下二元树 10 / \ 5 12 / \ 4 7则打印出两条路径:10, 12 和10, 5, 7。思路:1、当访问到某一节点时,把该结点的值添加到当前和变量,且把该结点压入栈中。2、若结点为叶子结点,且当前和变量==期望的和,则打印栈中的结点值,即为所需的路径。3、若结点不是叶子结点,继续访问它的左孩子结点,访问它的右孩子结点。4、删除该结... 阅读全文
摘要:
转自:zhedahht.blog.163.com/blog/static/25411174200712895228171/ 题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。分析:这是去年google的一道面试题。我看到这道题目时,第一反应就是每次push一个新元素时,将栈里所有逆序元素排序。这样栈顶元素将是最小元素。但由于不能保证最后push进栈的元素最先出栈,这种思路设计的数据结构已经不是一个栈了。在栈里添加一个成员变量存放最小元素(或最小元素的位置)。每次push一个新元素进栈的时候,如果该元素比当前的最小元 阅读全文
摘要:
1.把二元查找树转变成排序的双向链表题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。10/ \6 14/ \ / \4 8 12 16转换成双向链表4=6=8=10=12=14=16。首先我们定义的二元查找树节点的数据结构如下:struct BSTreeNode{int m_nValue; // value of nodeBSTreeNode *m_pLeft; // left child of nodeBSTreeNode *m_pRight; // right child of node};?123456789101112131 阅读全文