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); + } + + } +}