[关闭]
@qiezhian 2014-07-10T16:31:23.000000Z 字数 2031 阅读 1690

面试题选(3)

算法


1.在从 1 到 n 的正数中 1 出现的次数(数组)

题目:输入一个整数 n,求从 1 到 n 这 n 个整数的十进制表示中 1 出现的次数。
例如输入 12, 1 到 12 这些整数中包含 1 的数字有 1,
从10,11 和 12, 一共出现了 5 次。
分析:这是一道广为流传的 google 面试题。

2.蜂窝结构最短路径搜索

题目:一类似于蜂窝的结构的图,进行搜索最短路径(要求 5 分钟)
分析:华为面试题,要求5分钟。

3.交换数组元素使得数组之和相差最小

题目:有两个序列 a,b,大小都为 n,序列元素的值任意整数,无序;
要求:通过交换 a,b 中的元素,使[序列 a 元素的和]与[序列 b 元素的和]之间的差最小。
分析: 暴力解法,耗费Θ(N2)时间。从a中第一个元素开始,从b中找到一个元素,通过调换使得两数列之差减小最多。一趟下来要走N2次,而且可能不止一趟,当第n趟与第n-1趟没有差别,说明已达最优,则返回。求更好的解法。

  1. /*
  2. Filename: LeastSumDiff.cpp
  3. Function: void LeastSumDiff( int A[], int B[], int length )
  4. 有两个序列 a,b,大小都为 n,序列元素的值任意
  5. 整数,无序;要求:通过交换 a,b 中的元素,使序
  6. 列 a 元素的和与序列 b 元素的和之间的差最小
  7. Details: 暴力解法,期待更好的解法
  8. */
  9. #ifndef ABS
  10. #define ABS( a, b ) ((a)-(b))>0?((a)-(b)):((b)-(a))
  11. #endif
  12. #include <iostream>
  13. using namespace std;
  14. void LeastSumDiff( int A[], int B[], int length );
  15. void Swap( int *a, int *b );
  16. int main()
  17. {
  18. int a[] = { 1,3,5,9,10};
  19. int b[] = { 2,4,6,8,10};
  20. int length = sizeof(a)/sizeof(int);
  21. LeastSumDiff( a, b, length );
  22. for( int i=0; i<length; i++)
  23. {
  24. cout<<a[i]<<" "<<b[i]<<endl;
  25. }
  26. }
  27. void LeastSumDiff( int A[], int B[], int length )
  28. {
  29. int diff = 0;
  30. int sum_a=0, sum_b=0;
  31. for( int i=0; i<length; i++ )
  32. {
  33. sum_a += A[i];
  34. sum_b += B[i];
  35. }
  36. int diff_min = ABS( sum_a, sum_b );
  37. while( diff != diff_min )
  38. {
  39. diff = diff_min;
  40. int tmp=0;
  41. for( int i=0; i<length; i++ )
  42. for( int j=0; j<length; j++ )
  43. {
  44. tmp = ABS( sum_a-A[i]+B[j], sum_b+A[i]-B[j] );
  45. if( tmp < diff_min )
  46. {
  47. Swap( &A[i], &B[j] );
  48. diff_min = tmp;
  49. }
  50. if( diff_min==0 )
  51. return;
  52. }
  53. }
  54. }
  55. void Swap( int *a, int *b )
  56. {
  57. int tmp;
  58. tmp = *a;
  59. *a = *b;
  60. *b = tmp;
  61. }

4.实现一个字符匹配算法:

题目:给一串很长字符串,要求找到符合要求的字符串,例如目的串:123,则1******3***2,12*****3这些都要找出来其实就是类似一些和谐系统。

5.求一个矩阵中最大的二维矩阵(元素和最大).

题目:如:
1 2 0 3 4
2 3 4 5 1
1 1 5 3 0
中最大的是:
4 5
5 3
要求:(1)写出算法;(2)分析时间复杂度;(3)用 C 写出关键代码
分析: 给出的矩阵没有排序信息,也没有其它规律,只能暴力解决。从左到右,从上到下遍历矩阵,保存最大二维矩阵和的左上角值索引即可。

6.二叉树中和为某一值的路径

题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
分析:

7.树的子结构

题目: 输入两棵二叉树A 和B,判断B是否为A的子结构。
分析: 思路还是比较清晰的。如果B是A的子结构,那么B的根节点必须在A中,而且B根节点的左子树和右子树也该和A中对应的一样。算法步骤为:判断B的根节点值和A的根节点值是否相等,如果相等,则递归判断;如果B更大,则B和A的右子树比较,如果小于等于,则和左子树比较(假设允许存在重复数,且相等值均在左子树)。

8.二叉搜索树转有序双向链表

题目: 输入一棵二叉搜索树,现在要将该二叉搜索树转换成一个排序的双向链表。而且在转换的过程中,不能创建任何新的结点,只能调整树中的结点指针的指向来实现。
分析:

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注