摘要: 【试题描述】输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab,cba。分析:这是一道很好的考查对递归理解的编程题,因此在过去一年中频繁出现在各大公司的面试、笔试题中。我们以三个字符abc为例来分析一下求字符串排列的过程。首先我们固定第一个字符a,求后面两个字符bc的排列。当两个字符bc的排列求好之后,我们把第一个字符a和后面的b交换,得到bac,接着我们固定第一个字符b,求后面两个字符ac的排列。现在是把c放到第一位置的时候了。记住前面我们已经把原先的第一个字符a和后面的b做了交换,为了保证这 阅读全文
posted @ 2013-04-09 22:13 曾先森在努力 阅读(296) 评论(0) 推荐(1) 编辑
摘要: 【试题描述】 You are given a binary tree in which each node contains a value. Design an algorithm to print all paths which sum up to that value. Note that it can be any path in the tree-it does not have to start at the root. 输入一个整数和一棵二元树。从树的任意结点开始往下访问所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。解题思路: 一层一层的遍历,保存当前节点到根节 阅读全文
posted @ 2013-04-09 20:09 曾先森在努力 阅读(308) 评论(0) 推荐(0) 编辑
摘要: 【试题描述】输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如输入整数 22 和如下二元树 10 / \ 5 12 / \ 4 7则打印出两条路径:10, 12 和 10, 5, 7。据说这是百度的一道笔试题。分析:这道题考查对二叉树遍历方式的理解,采用后序遍历,如果把二叉树看成图,就是图的深度遍历。使用变量存放当前遍历的路径和,当访问到某一结点时,把该结点添加到路径上,并累加当前结点的值。如果当前结点为叶结点并且当前路径的和刚好等于... 阅读全文
posted @ 2013-04-09 19:08 曾先森在努力 阅读(1046) 评论(0) 推荐(0) 编辑
摘要: 【试题描述】数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。【试题分析】时间复杂度O(n),空间复杂度O(1) 思路1: 创建一个hash_map,key为数组中的数,value为此数出现的次数。遍历一遍数组,用hash_map统计每个数出现的次数,并用两个值存储目前出现次数最多的数和对应出现的次数。 这样可以做到O(n)的时间复杂度和O(n)的空间复杂度,满足题目的要求。 但是没有利用“一个数出现的次数超过了一半”这个特点。也许算法还有提高的空间。 思路2: 使用两个变量A和B,其中A存储某个数组中的数,B用来计数。开始时将B初始化为0。 遍历... 阅读全文
posted @ 2013-04-09 17:08 曾先森在努力 阅读(164) 评论(0) 推荐(0) 编辑
摘要: 【试题描述】输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度O(n)。思路:当我们加上一个正数时,和会增加;当我们加上一个负数时,和会减少。如果当前得到的和是个负数,那么这个和在接下来的累加中应该抛弃并重新清零,不然的话这个负数将会减少接下来的和。【参考代码】 1 public static int maxSum(int[] a) { 2 int sum = 0; 3 int b = 0; 4 for (int i = 0; i 0 *这个公式的意义: * 当以第(... 阅读全文
posted @ 2013-04-09 16:52 曾先森在努力 阅读(274) 评论(0) 推荐(0) 编辑
摘要: 【试题描述】我们把只包含因子2、3和5的数称作丑数。求按从到大的顺序的第1500个丑数。例如6,8是丑数,而14不是,因为它包含因子7.习惯上把1当作第一个丑数。 根据丑数的定义,丑数应该是另一个丑数乘以2、3或者5的结果(1除外)。因此我们可以创建一个数组,里面的数字是排好序的丑数。里面的每一个丑数是前面的丑数乘以2、3或者5得到的。那关键就是确保数组里的丑数是有序的了。我们假设数组中已经有若干个丑数,排好序后存在数组中。 接下来我们换一种思路来分析这个问题,试图只计算丑数,而不在非丑数的整数上花费时间。根据丑数的定义,丑数应该是另一个丑数乘以2、3或者5的结果(1除外)。因此我们可以创建一 阅读全文
posted @ 2013-04-09 16:19 曾先森在努力 阅读(250) 评论(0) 推荐(0) 编辑
摘要: 【试题描述】写一个函数,求两个整数的和,要求在函数体内不得使用加减乘除四则运算符合。基本思路是这样的:int A, B;A&B //看哪几位有进位A^B //不带进位加考虑二进制加法的过程,步骤一、A^B,能够得到没有进位的加法。步骤二、A&B,能够得到相加之后,能够进位的位置的信息。向左移动一位,就是两个二进制数相加之后的进位信息。所以,(A&B)<<1就是两个二进制数相加得到的“进位结果”。步骤三、将前两步的结果相加。相加的过程就是步骤一和步骤二,直到不再产生进位为止。【参考代码】 1 public static int func2(int a, int 阅读全文
posted @ 2013-04-09 15:51 曾先森在努力 阅读(418) 评论(0) 推荐(0) 编辑
摘要: 进程是什么?程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念。在多道编程中,我们允许多个程序同时加载到内存中,在操作系统的调度下,可以实现并发地执行。这是这样的设计,大大提高了CPU的利用率。进程的出现让每个用户感觉到自己独享CPU,因此,进程就是为了在CPU上实现多道编程而提出的。有了进程为什么还要线程?进程有很多优点,它提供了多道编程,让我们感觉我们每个人都拥有自己的CPU和其他资源,可以提高计算机的利用率。很多人就不理解了,既然进 阅读全文
posted @ 2013-04-09 15:01 曾先森在努力 阅读(188) 评论(0) 推荐(0) 编辑