Airbnb Interview - Nested Integer List Parser - 我的博客 - ITeye技术网站
实现一个mini parser, 输入是以下格式的string:"324" or"[123,456,[788,799,833],[[]],10,[]]"
要求输出:324 or [123,456,[788,799,833],[[]],10,[]].
也就是将字符串转换成对应的格式的数据.
输入一个数组的字符串, 要返回一个数组, 里面每一个元素是要么一个整数, 要么是一个数组.
但是注意数组可以多层嵌套.
Read full article from Airbnb Interview - Nested Integer List Parser - 我的博客 - ITeye技术网站
实现一个mini parser, 输入是以下格式的string:"324" or"[123,456,[788,799,833],[[]],10,[]]"
要求输出:324 or [123,456,[788,799,833],[[]],10,[]].
也就是将字符串转换成对应的格式的数据.
输入一个数组的字符串, 要返回一个数组, 里面每一个元素是要么一个整数, 要么是一个数组.
但是注意数组可以多层嵌套.
- public class NestedIntList {
- private int value;
- private List<NestedIntList> intList;
- private boolean isNumber;
- public NestedIntList(int v) {
- this.value = v;
- this.isNumber = true;
- }
- public NestedIntList() {
- this.intList = new ArrayList<>();
- this.isNumber = false;
- }
- public void add(NestedIntList l) {
- intList.add(l);
- }
- public static NestedIntList fromString(String s) {
- if(!s.startsWith("[")) {
- return new NestedIntList(Integer.parseInt(s));
- }
- NestedIntList result = null;
- Stack<NestedIntList> stack = new Stack<>();
- int i = 0, left = 1;
- while(i < s.length()) {
- char c = s.charAt(i);
- if(c == '[') {
- NestedIntList num = new NestedIntList();
- if(!stack.isEmpty()) {
- stack.peek().add(num);
- }
- stack.push(num);
- left = i+1;
- } else if(c == ',' || c == ']') {
- if(left != i) {
- int v = Integer.parseInt(s.substring(left, i));
- NestedIntList num = new NestedIntList(v);
- stack.peek().add(num);
- }
- left = i+1;
- if(c == ']') result = stack.pop();
- }
- i++;
- }
- return result;
- }
- public String toString() {
- if(isNumber) {
- return ""+value;
- } else {
- return intList.toString();
- }
- }
- }
private static class NestedIntList { private int value; private boolean isNumber; private List<NestedIntList> intList; // Constructor to construct a number public NestedIntList(int value) { this.value = value; isNumber = true; } // Constructor to construct a list public NestedIntList() { intList = new ArrayList<>(); isNumber = false; } public void add(NestedIntList num) { this.intList.add(num); } public NestedIntList miniParser(String s) { if (s == null || s.length() == 0) { return null; } // Corner case "123" if (s.charAt(0) != '[') { int num = Integer.parseInt(s); return new NestedIntList(num); } int i = 0; int left = 1; Stack<NestedIntList> stack = new Stack<>(); NestedIntList result = null; while (i < s.length()) { char c = s.charAt(i); if (c == '[') { NestedIntList num = new NestedIntList(); if (!stack.isEmpty()) { stack.peek().add(num); } stack.push(num); left = i + 1; } else if (c == ',' || c == ']') { if (left != i) { int value = Integer.parseInt(s.substring(left, i)); NestedIntList num = new NestedIntList(value); stack.peek().add(num); } left = i + 1; if (c == ']') { result = stack.pop(); } } i++; } return result; } public String toString() { if (this.isNumber) { return this.value + ""; } else { return this.intList.toString(); } } }}