测试(([]){}),说我数组下标越界,我没找出来
来源:3-4 关于Leetcode的更多说明
荒小北158
2018-12-19
class Solution {
public class Array<E> {
private E[] data;
private int size;
/**
*
* @param capacity
*/
public Array(int capacity) {
data = (E[]) new Object[capacity];
}
/**
* the default capacity is 10
*/
public Array() {
this(10);
}
/**
*@return the current data length of the array
*/
public int getSize() {
return size;
}
/**
* Determines whether the array is empty
* @return false or true
*/
public boolean isEmpty() {
return size == 0;
}
/**
* get the Array capacity
* @return Array capacity
*/
public int capacity() {
return data.length;
}
/**
* Insert an element on an index
* @param index
* @param e
*/
public void add(int index,E e) {
if (index < 0 || index > size)
throw new IllegalArgumentException("Add failed.Array is full");
if (size == data.length) {
resize(2*data.length);
}
for (int i = size - 1; i >= index; i--) {
data[i+1] = data[i];
}
data[index] = e;
size++;
}
private void resize(int newCapacity) {
E[] newData = (E[]) new Object[newCapacity];
for (int i = 0; i < size; i++) {
newData[i] = data[i];
}
data = newData;
}
public void addLast(E e) {
add(size,e);
}
/**
* Get the value of the index location
* @param index
* @return
*/
public E get(int index) {
if (index < 0 || index >= size)
throw new IllegalArgumentException("Get failed,Array is full");
return data[index];
}
/**
* Specify index insert value
* @param index
* @param e
*/
public void set(int index,E e) {
if (index < 0 || index >= size)
throw new IllegalArgumentException("set failed,Array is full");
data[index] = e;
}
/**
* Determine whether an array contains e
* @param e
* @return
*/
public boolean contains(E e) {
if (find(e) != -1)
return true;
else
return false;
}
/**
*find the index of "e" in the array
* @param e
* @return index of "e"
*/
public int find(E e) {
for (int i = 0; i < size; i++) {
if (data[i].equals(e))
return i;
}
return -1;
}
/**
* remove elements from index positions
* @param index
* @return
*/
public E remove(int index) {
if (index < 0 || index >= size)
throw new IllegalArgumentException("remove failed,array is full");
E ret = data[index];
for (int i = index + 1; i <= size; i++) {
data[i - 1] = data[i];
}
size--;
if (size == data.length/4 && data.length/2 != 0) {
resize(data.length/2);
}
return ret;
}
public E removeFirst() {
return remove(0);
}
public void removeElement(E e) {
if (find(e) != -1) {
int index = find(e);
for (int i = index + 1; i < size; i++)
data[i-1] = data[i];
size--;
}
}
/**
* remove all "e" from the array
* @param e
*/
public void removeElements(E e) {
for (int i = 0; i < size; i++) {
if (data[i].equals(e)) {
remove(i);
i--;
}
}
}
@Override
public String toString() {
StringBuilder res = new StringBuilder();
res.append(String.format("Array: size = %d , capacity = %d\n",size,data.length));
res.append("[");
for (int i = 0; i < size; i++) {
res.append(data[i]);
if (i < size - 1)
res.append(",");
}
res.append("]");
return res.toString();
}
public E removeLast() {
return remove(size - 1);
}
public E getLast() {
return data[size - 1];
}
}
public interface Stack<E> {
void push(E e); //push e into the stack
E pop(); //pop stack top element
E peek(); //view stack top elements
int getSize(); //view stack length
boolean isEmpty(); //check if the stack is empty
}
public class ArrayStack<E> implements Stack<E> {
/**
* Based on Dynamic Array
*/
private Array<E> array;
public ArrayStack(int capacity) {
array = new Array<>(capacity);
}
public ArrayStack() {
this(10);
}
@Override
public void push(E e) {
array.addLast(e);
}
@Override
public E pop() {
return array.removeLast();
}
@Override
public E peek() {
return array.getLast();
}
@Override
public int getSize() {
return array.getSize();
}
@Override
public boolean isEmpty() {
return array.isEmpty();
}
@Override
public String toString() {
StringBuilder str = new StringBuilder();
str.append("Stack[");
for (int i = 0; i < array.getSize() ; i++) {
str.append(array.get(i));
if(i < array.getSize() - 1) {
str.append(",");
}
}
str.append("] top");
return String.valueOf(str);
}
}
public boolean isValid(String s) {
ArrayStack<Character> arrayStack = new ArrayStack<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '(' || c == '{' || c == '[') {
arrayStack.push(c);
} else {
if (arrayStack.isEmpty())
return false;
char topChar = arrayStack.pop();
if (c == ')' && topChar != '(')
return false;
if (c == '}' && topChar != '{')
return false;
if (c == ']' && topChar != '[')
return false;
}
}
return arrayStack.isEmpty();
}
}
public static void main(String[] args) {
System.out.println(new Solution().isValid("(([]){})"));
}
写回答
1回答
-
抱歉,你这样贴代码,我不能帮你调试。如果每个买了课的同学都找我调试代码,我可累死了。而且这也不是老师的任务。你需要自己调试。请谅解。
课程中视频写的所有代码都可以通过课程官方github获得。传送门:https://github.com/liuyubobobo/Play-with-Data-Structures
以下代码是这一小节使用课程编写的ArrayStack,可以通过Leetcode测试的代码,如果需要,可以进行比对,参考。
class Solution { public class Array<E> { private E[] data; private int size; // 构造函数,传入数组的容量capacity构造Array public Array(int capacity){ data = (E[])new Object[capacity]; size = 0; } // 无参数的构造函数,默认数组的容量capacity=10 public Array(){ this(10); } // 获取数组的容量 public int getCapacity(){ return data.length; } // 获取数组中的元素个数 public int getSize(){ return size; } // 返回数组是否为空 public boolean isEmpty(){ return size == 0; } // 在index索引的位置插入一个新元素e public void add(int index, E e){ if(index < 0 || index > size) throw new IllegalArgumentException("Add failed. Require index >= 0 and index <= size."); if(size == data.length) resize(2 * data.length); for(int i = size - 1; i >= index ; i --) data[i + 1] = data[i]; data[index] = e; size ++; } // 向所有元素后添加一个新元素 public void addLast(E e){ add(size, e); } // 在所有元素前添加一个新元素 public void addFirst(E e){ add(0, e); } // 获取index索引位置的元素 public E get(int index){ if(index < 0 || index >= size) throw new IllegalArgumentException("Get failed. Index is illegal."); return data[index]; } public E getLast(){ return get(size - 1); } public E getFirst(){ return get(0); } // 修改index索引位置的元素为e public void set(int index, E e){ if(index < 0 || index >= size) throw new IllegalArgumentException("Set failed. Index is illegal."); data[index] = e; } // 查找数组中是否有元素e public boolean contains(E e){ for(int i = 0 ; i < size ; i ++){ if(data[i].equals(e)) return true; } return false; } // 查找数组中元素e所在的索引,如果不存在元素e,则返回-1 public int find(E e){ for(int i = 0 ; i < size ; i ++){ if(data[i].equals(e)) return i; } return -1; } // 从数组中删除index位置的元素, 返回删除的元素 public E remove(int index){ if(index < 0 || index >= size) throw new IllegalArgumentException("Remove failed. Index is illegal."); E ret = data[index]; for(int i = index + 1 ; i < size ; i ++) data[i - 1] = data[i]; size --; data[size] = null; // loitering objects != memory leak if(size == data.length / 4 && data.length / 2 != 0) resize(data.length / 2); return ret; } // 从数组中删除第一个元素, 返回删除的元素 public E removeFirst(){ return remove(0); } // 从数组中删除最后一个元素, 返回删除的元素 public E removeLast(){ return remove(size - 1); } // 从数组中删除元素e public void removeElement(E e){ int index = find(e); if(index != -1) remove(index); } @Override public String toString(){ StringBuilder res = new StringBuilder(); res.append(String.format("Array: size = %d , capacity = %d\n", size, data.length)); res.append('['); for(int i = 0 ; i < size ; i ++){ res.append(data[i]); if(i != size - 1) res.append(", "); } res.append(']'); return res.toString(); } // 将数组空间的容量变成newCapacity大小 private void resize(int newCapacity){ E[] newData = (E[])new Object[newCapacity]; for(int i = 0 ; i < size ; i ++) newData[i] = data[i]; data = newData; } } public boolean isValid(String s) { ArrayStack<Character> stack = new ArrayStack<>(); for(int i = 0 ; i < s.length() ; i ++){ char c = s.charAt(i); if(c == '(' || c == '[' || c == '{') stack.push(c); else{ if(stack.isEmpty()) return false; char topChar = stack.pop(); if(c == ')' && topChar != '(') return false; if(c == ']' && topChar != '[') return false; if(c == '}' && topChar != '{') return false; } } return stack.isEmpty(); } public interface Stack<E> { int getSize(); boolean isEmpty(); void push(E e); E pop(); E peek(); } public class ArrayStack<E> implements Stack<E> { private Array<E> array; public ArrayStack(int capacity){ array = new Array<>(capacity); } public ArrayStack(){ array = new Array<>(); } @Override public int getSize(){ return array.getSize(); } @Override public boolean isEmpty(){ return array.isEmpty(); } public int getCapacity(){ return array.getCapacity(); } @Override public void push(E e){ array.addLast(e); } @Override public E pop(){ return array.removeLast(); } @Override public E peek(){ return array.getLast(); } @Override public String toString(){ StringBuilder res = new StringBuilder(); res.append("Stack: "); res.append('['); for(int i = 0 ; i < array.getSize() ; i ++){ res.append(array.get(i)); if(i != array.getSize() - 1) res.append(", "); } res.append("] top"); return res.toString(); } } }
加油!:)
012018-12-19
相似问题