diff --git a/javaturorial.iml b/javaturorial.iml
index 4e3316b..175c741 100644
--- a/javaturorial.iml
+++ b/javaturorial.iml
@@ -10,7 +10,7 @@
-
+
\ No newline at end of file
diff --git a/src/main/java/cn/byhieg/arithmetic/SlidingWindow.java b/src/main/java/cn/byhieg/arithmetic/SlidingWindow.java
new file mode 100644
index 0000000..d97e9a9
--- /dev/null
+++ b/src/main/java/cn/byhieg/arithmetic/SlidingWindow.java
@@ -0,0 +1,139 @@
+package cn.byhieg.arithmetic;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Created by weizhaoquan on 2019/03/20.
+ */
+
+public class SlidingWindow {
+
+ private AtomicInteger[] timeSlices;
+ /* 队列的总长度 */
+ private final int timeSliceSize;
+ /* 每个时间片的时长 */
+ private final long timeMillisPerSlice;
+ /* 窗口长度 */
+ private final int windowSize;
+
+ /* 当前所使用的时间片位置 */
+ private AtomicInteger cursor = new AtomicInteger(0);
+
+ public static enum Time {
+ MILLISECONDS(1),
+ SECONDS(1000),
+ MINUTES(SECONDS.getMillis() * 60),
+ HOURS(MINUTES.getMillis() * 60),
+ DAYS(HOURS.getMillis() * 24),
+ WEEKS(DAYS.getMillis() * 7);
+
+ private long millis;
+
+ Time(long millis) {
+ this.millis = millis;
+ }
+
+ public long getMillis() {
+ return millis;
+ }
+ }
+
+ public SlidingWindow(int windowSize, Time timeSlice) {
+ this.timeMillisPerSlice = timeSlice.millis;
+ this.windowSize = windowSize;
+ // 保证存储在至少两个window
+ this.timeSliceSize = windowSize * 2 + 1;
+
+ init();
+ }
+
+ /**
+ * 初始化
+ */
+ private void init() {
+ AtomicInteger[] localTimeSlices = new AtomicInteger[timeSliceSize];
+ for (int i = 0; i < timeSliceSize; i++) {
+ localTimeSlices[i] = new AtomicInteger(0);
+ }
+ timeSlices = localTimeSlices;
+ }
+
+ private int locationIndex() {
+ long time = System.currentTimeMillis();
+ return (int) ((time / timeMillisPerSlice) % timeSliceSize);
+ }
+
+ /**
+ *
对时间片计数+1,并返回窗口中所有的计数总和
+ *
该方法只要调用就一定会对某个时间片进行+1
+ * @return
+ */
+ public int incrementAndSum() {
+ int index = locationIndex();
+ int sum = 0;
+ // cursor等于index,返回true
+ // cursor不等于index,返回false,并会将cursor设置为index
+ int oldCursor = cursor.getAndSet(index);
+ if (oldCursor == index) {
+ // 在当前时间片里继续+1
+ sum += timeSlices[index].incrementAndGet();
+ } else {
+ //轮到新的时间片,置0,可能有其它线程也置了该值,容许
+ timeSlices[index].set(0);
+ // 清零,访问量不大时会有时间片跳跃的情况
+ clearBetween(oldCursor, index);
+
+ sum += timeSlices[index].incrementAndGet();
+ }
+
+ for (int i = 1; i < windowSize; i++) {
+ sum += timeSlices[(index - i + timeSliceSize) % timeSliceSize].get();
+ }
+ return sum;
+ }
+
+ /**
+ * 判断是否允许进行访问,未超过阈值的话才会对某个时间片+1
+ * @param threshold
+ * @return
+ */
+ public boolean allow(int threshold) {
+ int index = locationIndex();
+ int sum = 0;
+ int oldCursor = cursor.getAndSet(index);
+ if (oldCursor != index) {
+ timeSlices[index].set(0);
+ clearBetween(oldCursor, index);
+ }
+ for (int i = 0; i < windowSize; i++) {
+ sum += timeSlices[(index - i + timeSliceSize) % timeSliceSize].get();
+ }
+
+ // 阈值判断
+ if (sum < threshold) {
+ // 未超过阈值才+1
+ timeSlices[index].incrementAndGet();
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ *
将fromIndex~toIndex之间的时间片计数都清零
+ *
极端情况下,当循环队列已经走了超过1个timeSliceSize以上,这里的清零并不能如期望的进行
+ * @param fromIndex 不包含
+ * @param toIndex 不包含
+ */
+ private void clearBetween(int fromIndex, int toIndex) {
+ for (int index = (fromIndex + 1) % timeSliceSize; index != toIndex; index = (index + 1) % timeSliceSize) {
+ timeSlices[index].set(0);
+ }
+ }
+
+ public static void main(String[] args) {
+ SlidingWindow window = new SlidingWindow(5, Time.MILLISECONDS);
+ for (int i = 0; i < 10; i++) {
+ System.out.println(window.allow(7));
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/cn/byhieg/arithmetic/TwoDimensionalArray.java b/src/main/java/cn/byhieg/arithmetic/TwoDimensionalArray.java
new file mode 100644
index 0000000..27534ee
--- /dev/null
+++ b/src/main/java/cn/byhieg/arithmetic/TwoDimensionalArray.java
@@ -0,0 +1,32 @@
+package cn.byhieg.arithmetic;
+
+/**
+ * Created by weizhaoquan on 2019/04/08.
+ */
+public class TwoDimensionalArray {
+ public static int[][] rotate(int[][] matrix){
+ int n= matrix.length;
+ int[][] m = new int[n][n];
+ for (int row = 0;row < n; row ++) {
+ for (int col=0;col map = new HashMap<>();
+ for(int i = 0; i < nums.length; i++) {
+ map.put(nums[i], i);
+ }
+ for(int i = 0; i < nums.length; i++){
+ int val = target - nums[i];
+ if(map.containsKey(val) && map.get(val) != i){
+ return new int[]{i, map.get(val)};
+ }
+ }
+ throw new RuntimeException("No such solution!");
+ }
+ public static int[] twoSum2(int[] nums, int target) {
+ HashMap map = new HashMap<>();
+ for(int i = 0; i < nums.length; i++){
+ int val = target - nums[i];
+ if(map.containsKey(val)) {// 肯定不会map.get(val) == i
+ return new int[]{i, map.get(val)};
+ }
+ map.put(nums[i], i);
+ }
+ throw new RuntimeException("No such solution!");
+ }
+
+ public static void main(String[] args) {
+ int[] nums = {2,7,11,15};
+ int taget = 9;
+ int[] ints = twoSum2( nums, taget );
+ System.out.printf( Arrays.toString(ints) );
+ }
+}
diff --git a/src/main/java/cn/byhieg/arithmetic/sort/BubbleSort.java b/src/main/java/cn/byhieg/arithmetic/sort/BubbleSort.java
new file mode 100644
index 0000000..a68c190
--- /dev/null
+++ b/src/main/java/cn/byhieg/arithmetic/sort/BubbleSort.java
@@ -0,0 +1,78 @@
+package cn.byhieg.arithmetic.sort;
+
+/**
+ * Created by weizhaoquan on 2019/04/17.
+ */
+public class BubbleSort {
+
+ static void swap (int[] arr,int i,int j){
+ int temp = arr[i];
+ arr[i]=arr[j];
+ arr[j]=temp;
+ }
+ static void bubbleSort1(int[] arr){
+ for (int end = arr.length-1;end>0;end--) {
+ boolean isSort = true;
+ for (int i = 0 ;iarr[i+1]) {
+ swap( arr,i,i+1 );
+ isSort = false;
+ }
+ }
+ if (isSort) {
+ break;
+ }
+ }
+ }
+
+ static void bubbleSort2(int[] arr){
+ for (int end = arr.length;end >0 ;end--) {
+ int border = 0 ;
+ for (int i= 0;i0 && temp0;g/=2) {
+ for (int end = g;end=0 && key key) {
+ R= mid-1;
+ }else{
+ L=mid+1;
+ }
+ }
+ for (int j = i-1;j>=L;j--) {
+ arr[j+1] =arr[j];
+ }
+ arr[L] = key;
+
+ }
+ }
+ public static void main(String[] args){
+ int[] arr = {3,6,5,7,3,7,8,9,1};
+ insertSort(arr);
+ System.out.printf( "1排序后的数组为 :" );
+ for (int num:arr) {
+ System.out.printf(" "+num);
+ }
+
+ }
+}