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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)