package leetcode;

import java.util.HashMap;
import java.util.Map;

/**
 * https://leetcode.com/problems/snapshot-array/
 */
public class Problem1146 {
    private static class SnapshotArray {
        private final int length;
        private int snapshot;
        private final Map</*snapshot ID*/ Integer, int[]> snapshots = new HashMap<>();

        public SnapshotArray(int length) {
            this.length = length;
        }

        public void set(int index, int val) {
            if (!snapshots.containsKey(snapshot)) {
                snapshots.put(snapshot, new int[length]);
            }
            snapshots.get(snapshot)[index] = val;
        }

        public int snap() {
            return snapshot++;
        }

        public int get(int index, int snap_id) {
            if (!snapshots.containsKey(snap_id)) {
                return 0;
            }
            return snapshots.get(snap_id)[index];
        }
    }

    public static void main(String[] args) {
        SnapshotArray sa = new SnapshotArray(3);
//        sa.set(0, 5);
//        System.out.println(sa.snap()); // 0
//        sa.set(0, 6);
//        System.out.println(sa.get(0, 0)); // 5

        sa = new SnapshotArray(1);
        sa.set(0, 15);
        System.out.println(sa.snap()); // 0
        System.out.println(sa.snap()); // 1
        System.out.println(sa.snap()); // 2
        System.out.println(sa.get(0, 2)); // 15
        System.out.println(sa.snap()); // 3
        System.out.println(sa.snap()); // 4
        System.out.println(sa.get(0, 0)); // 15
    }
}

@@ -12,16 +12,41 @@
 tcode;%0A%0A
+import java.util.Arrays;%0A
 import j
@@ -432,32 +432,86 @@
 ength = length;%0A
+            snapshots.put(snapshot, new int%5Blength%5D);%0A
         %7D%0A%0A     
@@ -555,37 +555,32 @@
 ) %7B%0A            
-if (!
 snapshots.contai
@@ -577,32 +577,35 @@
 ots.
-containsKey(snapshot)) %7B
+get(snapshot)%5Bindex%5D = val;
 %0A   
@@ -605,32 +605,35 @@
 al;%0A        
+%7D%0A%0A
         
 snapshots.pu
@@ -624,63 +624,27 @@
     
-snapshots.put(snapshot, new int%5Blength%5D);%0A            %7D
+public int snap() %7B
 %0A   
@@ -654,34 +654,34 @@
       snapshots.
-ge
+pu
 t(snapshot)%5Binde
@@ -670,39 +670,29 @@
 put(snapshot
-)%5Bindex%5D = val;
+ + 1,
 %0A        %7D%0A%0A
@@ -684,35 +684,32 @@
  1,%0A        
-%7D%0A%0A
         
 public int s
@@ -696,35 +696,64 @@
         
-public int snap() %7B
+Arrays.copyOf(snapshots.get(snapshot), length));
 %0A       
@@ -1088,18 +1088,16 @@
 ray(3);%0A
-//
         
@@ -1110,18 +1110,16 @@
 (0, 5);%0A
-//
         
@@ -1154,18 +1154,16 @@
 ); // 0%0A
-//
         
@@ -1176,18 +1176,16 @@
 (0, 6);%0A
-//
         
@@ -1224,16 +1224,18 @@
 ; // 5%0A%0A
+//
         
@@ -1261,16 +1261,18 @@
 ray(1);%0A
+//
         
@@ -1282,24 +1282,26 @@
 set(0, 15);%0A
+//
         Syst
@@ -1324,32 +1324,34 @@
 a.snap()); // 0%0A
+//
         System.o
@@ -1378,16 +1378,18 @@
 ); // 1%0A
+//
         
@@ -1424,16 +1424,18 @@
 ); // 2%0A
+//
         
@@ -1470,24 +1470,26 @@
  2)); // 15%0A
+//
         Syst
@@ -1520,16 +1520,18 @@
 ); // 3%0A
+//
         
@@ -1566,16 +1566,18 @@
 ); // 4%0A
+//
         

Update problem 1146