MS100 [011]
求二叉树中节点的最大距离
思路:在某个子树中,最大距离是左子树中最长枝到右子树中最长枝的距离。简单的递归,每次递归中,返回值用max(left,right)+1,当前节点所在子树的最大距离为max(left)+max(right),用一个引用变量记录最大的距离值。
MS100 [013]
输出该链表中倒数第k个结点
输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针。
思路:设置两个指针p1,p2,p1和p2之间间隔k个节点。
MS100 [014]
两数之和为一定值
输入一个已经按升序排序过的数组和一个数字,
在数组中查找两个数,使得它们的和正好是输入的那个数字。
要求时间复杂度是O(n)。
思路:方案一、两个指针,一个头指针一个尾指针。和大于sum时尾减一,和小于sum时头加一。
方案二、用sum减去这个数组得到新数组,比较两个数组中是否有相同的数字。
MS100 [017]
第一个出现一次的字符
在一个字符串中找到第一个只出现一次的字符。
如输入abaccdeff,则输出b。
思路:方案一,用一个数组或者HashTable统计字符出现次数,然后再次遍历字符串,找到第一个出现次数为1的字符。
方案二,记录出现次数时,也记录第一次出现的位置。遍历字符串后,再遍历数组或者HashTable,找到出现次数为1的所有字符中第一次出现位置最小的那个。
MS100 [018]
约瑟夫问题
n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,
每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。
当一个数字删除后,从被删除数字的下一个继续删除第m个数字。
求出在这个圆圈中剩下的最后一个数字。
思路:存在数学递归解,f(1, m) = 0;f(n,m)=(f(n-1,m)+m)%n;
int joseph(int n, int m) {
int fn=0;
for (int i=2; i<=n; i++) fn = (fn+m)%i; //当n远大于m时,此处可优化
return fn;
}
O(n)的复杂度。
MS100 [019]
Fibonacci数列
定义Fibonacci 数列如下:
f(0) = 0 f(1)= 1
f(n) = f(n-1)+f(n-2) n>=2
输入n,用最快的方法求该数列的第n 项。
思路:注意数值类型(long),并使用公式
分治求矩阵的n次方,在O(log n)可解。
MS100 [020]
输入一个表示整数的字符串,把该字符串转换成整数并输出。
思路:注意正负号,最开始的0,小数点,溢出等。