2014-04-26 19:11

题目:设计一个循环数组,使其支持高效率的循环移位。并能够使用foreach的方式访问。

解法:foreach不太清楚,循环移位我倒是实现了一个,用带有偏移量的数组实现。修改元素不一定能做到O(1)时间,但循环移位能在O(1)时间解决。不得不说,用不熟的语言写面试题,很难~~~

代码:

  1. // 14.6 Implement a circular array, which allows easy rotation and array access.
  2. // Combination of a vector and a rotation index.
  3. import java.io.PrintStream;
  4. import java.util.Vector;
  5.  
  6. public class CircularArray<T> {
  7. public int rotateIndex;
  8. public Vector<T> v;
  9.  
  10. public CircularArray() {
  11. v = new Vector<T>();
  12. rotateIndex = 0;
  13. }
  14.  
  15. public T elementAt(int index) {
  16. if (index < 0 || index > v.size() - 1) {
  17. throw new ArrayIndexOutOfBoundsException();
  18. }
  19. return v.elementAt((index + rotateIndex) % v.size());
  20. }
  21.  
  22. public void add(T val) {
  23. if (v.size() > 0) {
  24. v.insertElementAt(val, (rotateIndex + v.size() - 1) % v.size() + 1);
  25. if (rotateIndex > 0) {
  26. ++rotateIndex;
  27. }
  28. } else {
  29. v.insertElementAt(val, 0);
  30. }
  31. }
  32.  
  33. public void removeElementAt(int index) {
  34. if (rotateIndex > 0) {
  35. if (index < 0 || index > v.size() - 1) {
  36. throw new ArrayIndexOutOfBoundsException();
  37. }
  38. int tmp = v.size();
  39. v.removeElementAt((index + rotateIndex) % v.size());
  40. if (index >= tmp - rotateIndex && index <= tmp - 1) {
  41. --rotateIndex;
  42. }
  43. } else {
  44. v.removeElementAt(index);
  45. }
  46. }
  47.  
  48. public void rotate(int index) {
  49. if (v.size() == 0) {
  50. return;
  51. }
  52. index = (v.size() - (v.size() - index) % v.size()) % v.size();
  53. rotateIndex = (rotateIndex + index) % v.size();
  54. }
  55.  
  56. public static void main(String[] args) {
  57. CircularArray<Integer> c = new CircularArray<Integer>();
  58. PrintStream cout = System.out;
  59.  
  60. c.add(3);
  61. c.add(4);
  62. cout.println(c.v);
  63. c.add(7);
  64. cout.println(c.v);
  65. c.rotate(2);
  66. c.add(12);
  67. c.add(25);
  68. cout.println(c.v);
  69. c.rotate(-1);
  70. c.add(77);
  71. cout.println(c.v);
  72. c.removeElementAt(2);
  73. cout.println(c.v);
  74. cout.println(c.elementAt(0));
  75. }
  76. }

《Cracking the Coding Interview》——第14章:Java——题目6的更多相关文章

  1. Cracking the coding interview 第一章问题及解答

    Cracking the coding interview 第一章问题及解答 不管是不是要挪地方,面试题具有很好的联系代码总用,参加新工作的半年里,做的大多是探索性的工作,反而代码写得少了,不高兴,最 ...

  2. 《Cracking the Coding Interview》读书笔记

    <Cracking the Coding Interview>是适合硅谷技术面试的一本面试指南,因为题目分类清晰,风格比较靠谱,所以广受推崇. 以下是我的读书笔记,基本都是每章的课后习题解 ...

  3. Cracking the coding interview目录及资料收集

    前言 <Cracking the coding interview>是一本被许多人极力推荐的程序员面试书籍, 详情可见:http://www.careercup.com/book. 第六版 ...

  4. Cracking the coding interview

    写在开头 最近忙于论文的开题等工作,还有阿里的实习笔试,被虐的还行,说还行是因为自己的水平或者说是自己准备的还没有达到他们所需要人才的水平,所以就想找一本面试的书<Cracking the co ...

  5. Cracking the Coding Interview(Trees and Graphs)

    Cracking the Coding Interview(Trees and Graphs) 树和图的训练平时相对很少,还是要加强训练一些树和图的基础算法.自己对树节点的设计应该不是很合理,多多少少 ...

  6. Cracking the Coding Interview(Stacks and Queues)

    Cracking the Coding Interview(Stacks and Queues) 1.Describe how you could use a single array to impl ...

  7. 《Cracking the Coding Interview》——第14章:Java——题目5

    2014-04-26 19:06 题目:Java中的对象反射机制是什么?有鼠么用? 解法:完全不了解,因为java编程经验太少,完全没用过.查了一些资料后,感觉反射机制是个强大并需要边用边体会的强大工 ...

  8. 《Cracking the Coding Interview》——第14章:Java——题目4

    2014-04-26 19:02 题目:解释下C++里模板和java里泛型的区别? 解法:我很少用java,属于连语法都不过关的程度.所以这个题还真没法详细答,查了些资料以后写了以下几点. 代码: / ...

  9. 《Cracking the Coding Interview》——第14章:Java——题目3

    2014-04-26 18:59 题目:final.finally.finalize有什么区别? 解法:烂大街之java语法题.此题被多少公司考过我不知道,反正我确实遇见过一次了. 代码: // 14 ...

随机推荐

  1. 如何在CRM WebClient UI里使用HANA Live Report

    1. 使用业务角色ANALYTICSPRO登录SAP CRM WebClient UI: 点击新建按钮创建一个新的HANA live report: 类型选择SHL: 弹出窗口,维护report的名称 ...

  2. SAP CRM WebClient UI和Hybris backoffice UI开发的相同点

    CRM WebClient和Hybris backoffice的UI开发都不需要开发人员手写原生的html代码. CRM WebClient UI 在CRM WebUI workbench里,开发人员 ...

  3. SQL:数据库批量插入数据

    测试中有些功能要求有足够的数据进行测试,当输入字段较多时通过页面添加很慢.业务只关联单个数据库表可以通过数据库批量插入数据 批量插入数据示例: declare @i int--声明变量 --变量初始化 ...

  4. IOS 数据加密总结(及MD5加密)

    数据安全总结 1.网络数据加密1> 加密对象:隐私数据,比如密码.银行信息2> 加密方案* 提交隐私数据,必须用POST请求* 使用加密算法对隐私数据进行加密,比如MD53> 加密增 ...

  5. user(),current_user()函数的区别

    user() 表示当前的登录用户   current_user() 表示对应于mysql.user表里对应的账号.

  6. java中string类型转换成map

    背景:有时候string类型的数据取出来是个很标准的key.value形式,通过Gson的可以直接转成map 使用方式: Gson gson = new Gson(); Map<String, ...

  7. POJ-1990 MooFest---两个树状数组

    题目链接: https://vjudge.net/problem/POJ-1990 题目大意: 一群牛参加完牛的节日后都有了不同程度的耳聋,第i头牛听见别人的讲话,别人的音量必须大于v[i],当两头牛 ...

  8. Uva 11384 正整数序列

    题目链接:https://vjudge.net/problem/UVA-11384 题意:给定正整数 n,用最少的操作把序列 1,2,,,n 全部变成 0: 操作是:每次可以从序列中选择一个或者多个, ...

  9. nginx缓存批量清除

    研究了一段时间的缓存清除,说说了解的三种方式吧.        1. 原始的只增加缓存模块的,根据访问的路径一条条清除. 根据此方式要进行批量清除的话,必须在设定的缓存目录下通过自己写的程序来读取ng ...

  10. 2017.9.14 HTML学习总结---超链接标签图片标签

    2.4 超链接标签 定义:它是指从一个对象指向另一个对象的指针,它可以是网页中的一段文字  也可以是一张图片,以实现从一个页面到另一个页面的跳转. 格式:<a href="url&qu ...