数据结构题目

1. 第K个置换序列

  set[1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the permutations in order, We get the following sequence (ie, forn= 3):

  "123"
  "132"
  "213"
  "231"
  "312"
  "321"

  Given n and k, return the kth permutation sequence

  先求第一位上的数字:固定第一位上的数字,后面可能的情况是 (n-1)!,则第一位上的数字为 k/(n-1)!

  同理第二位上的数组 k%(n-1)!/ (n-2)!

  依次往下

2. 贪心,动态规划,搜索:

  每个阶段只有一个状态->递推;
  每个阶段的最优状态都是由上一个阶段的最优状态得到的->贪心;
  每个阶段的最优状态是由之前所有阶段的状态的组合得到的->搜索;
  每个阶段的最优状态可以从之前某个阶段的某个或某些状态直接得到而不管之前这个状态是如何得到的->动态规划

3. 最大子数组问题:这里用分治法

  把数组等分成Aleft,Aright两部分,那么最大子数组有三种可能情况,在Aleft/Aright中,或者跨越这个两个子数组,前两者可以递归求解,跨越两个子数组如何求解呢?从分割点,往前遍历,求得left最大值(以mid结尾),同理可以求得right的最大值。两者相加即跨越两个子数组的最大值。时间复杂度是O(nlogn)

  一种O(n)复杂度的解法是:假设已求得 i 之前的最大子数组和max_so_far,下一步则是要求 i + 1以前的所有最大子数组,此时最大的子数组为max(max_so_far,max_ending_i+1),此时转化成求解max_ending_i+1的问题,max_ending_i+1 = max(max_so_far + a[i+1], a[i+1])

4. 有这样一种编码:如,N=134,M=f(N)=143,N=020,M=fun(N)=101,其中N和M的位数一样,N,M可以均可以以0开头,N,M的各位数之和要相等,即1+3+4=1+4+3,且M是大于N中最小的一个,现在求这样的序列S,N为一个定值,其中S(0)=N,S(1)=fun(N),S(2)=fun(S(1))。

   》首先将数字转化为字符串,字符串的开始是数字高位,字符串的末尾是数字低位
   》从字符串末尾往前扫描,找出第一个大于0的数字,减1
   》继续往前找,找到第一个小于9的数字,加1
   》将该位之后到末尾的字符重新排序(不包括该位),即可得所求结果
5. 静态方法里面为什么不能声明静态变量?

  静态变量属于他所在的类,而静态方法中的静态变量的作用域只在这个静态方法内,所以不能声明静态变量。

6. 如果让你设计一个类,什么时候把变量声明为静态类型?
  当类的所有对象都和一个变量相关时,声明为静态变量。

7. 抽象类和接口的具体区别是什么?
  抽象类可以有方法的实现,接口没有方法的实现。抽象类一般是本质的东西,比如人,而接口一般是附加的东西,比如会飞,flyable,跑,runnable. 抽象类可以没有抽象方法,而接口只能有抽象方法,抽象类有构造方法而接口没有构造方法。java只能单继承,不过可以同时实现多个接口。

8、给定n个实数  ,求着n个实数在实轴上向量2个数之间的最大差值,要求线性的时间算法。 

  将这n个实数排序,求相邻元素的最大值,但是时间复杂度是O(nlgn),不满足线性的要求。通过分桶方法完成近似排序。

  step1:遍历n个数找到max和min

  step2:对剩余的n-2个数,映射到n-1长度为(max-min)/n-1个小桶内,将这个n-2个数分到这n-1个桶内,并求每个桶的max和min。并且注意到这n-1个桶至少有一个桶是空的,那么最大差值一定不再桶内出现,而在相邻桶之间出现。

  step3:遍历min1,max1,min2,max2....,O(n)时间找出相邻元素的最大差值。

9. 输入文件的第一行是一个正整数T, 代表测试数据的数量. 接下来T行, 每行为一个测试数据, 有两个数字, 第一个数字为一个十进制小数d, 为面试官出的题目里的数字, 0<=d<=10000, 且小数点后的数位都是4位; 第二个数字是一个非负整数k(1<=k<=100), 代表要给出的答案小数点后需要输出k位.

输出描述:对于输入文件里的每个测试数据, 输出相应的答案, 答案的格式为n(10)=m(2), 具体可参照样例输出.


样例输入

3

7.7000 3

0.5000 5

3.1416 2

样例输出:

7.7000(10)=111.101(2)

0.5000(10)=0.10000(2)

3.1416(10)=11.00(2)

整数部分转换2进制,从右往左,除二取余;小数部分从左往右,乘二取整。

 

posted on 2015-06-04 11:27  keketse  阅读(210)  评论(0编辑  收藏  举报

导航