package Solution;import java.util.*;public class CodeTop_0822 {//无重复字符的最长子串 abcadebb 用hashmap存储 char和indexpublic static int lengthOfLongestSubstring(String s) {if (s.length()==0){return 0;}//存储当前存储的字符串HashMap<Character, Integer> hashMap = new HashMap<>();int n=s.length();int i=0;int j=0;int maxLen = 1;while (j<n){//判断是否包含if (!hashMap.containsKey(s.charAt(j))){//此时更新最大长度maxLen=Math.max(maxLen,j-i+1);}else{//获取重复字符的下标Integer index = hashMap.get(s.charAt(j));//判断获取的index是不是在i和j之间if (index>=i){i=index+1;}else{//此时不在这个区间范围内 正常添加 没有影响maxLen=Math.max(maxLen,j-i+1);}}//更新字符位置hashMap.put(s.charAt(j),j);j++;}return maxLen;}//反转链表public ListNode reverseList(ListNode head) {ListNode pre = null;ListNode p = head;while (p!=null){ListNode pp=p.next;p.next=pre;pre=p;p=pp;}return pre;}//数组中第k个最大元素public static int findKthLargest(int[] nums, int k) {int n = nums.length;int targetIndex = n-k;quickSortFindLarge(nums,0,nums.length-1,targetIndex);return nums[targetIndex];}private static void quickSortFindLarge(int[] nums, int left, int right, int targetIndex) {int i=0;int j=right;int tempV = nums[left];while (i<=j){if (nums[i]<=tempV){i++;}else if (nums[j]>=tempV){j--;}else{//进行元素交换int temp = nums[i];nums[i] = nums[j];nums[j] = temp;i++;j--;}}nums[left]=nums[j];nums[j]=tempV;//在左边 和 在右边if (targetIndex<j){quickSortFindLarge(nums,left,j-1,targetIndex);}else if (targetIndex>j){quickSortFindLarge(nums,j+1,right,targetIndex);}}//k个一组翻转链表public static ListNode reverseListI(ListNode head){ListNode pre = null;ListNode p = head;while (p!=null){ListNode pp=p.next;p.next=pre;pre=p;p=pp;}return pre;}//区间翻转链表public static ListNode reverseII(ListNode head, int left, int right){ListNode leftPreNode = null;ListNode lefeNode = head;ListNode rightNode = head;while (--left>0){leftPreNode=lefeNode;lefeNode=lefeNode.next;}while (--right>0){rightNode=rightNode.next;}//记录下一个节点ListNode rightNext = rightNode.next;//断开rightNode.next=null;//根据前面节点进行判断if (leftPreNode==null){ListNode newHead = reverseListI(lefeNode);lefeNode.next=rightNext;return newHead;}else{leftPreNode.next=null;ListNode node = reverseListI(lefeNode);lefeNode.next=rightNext;leftPreNode.next=node;return head;}}//1 2 3 4 5//每k个节点进行翻转public static ListNode reverseKGroup(ListNode head, int k) {int count=0;ListNode p=head;while (p!=null){count++;p=p.next;}for (int i=0;i<count/k;i++){int left = k*i+1;int right = k*i+k;System.out.println(left+"-"+right);//每次都对head进行更新head = reverseII(head,left,right);}return head;}//三数之和public static List<List<Integer>> threeSum(int[] nums) {Arrays.sort(nums);List<List<Integer>> res = new ArrayList<>();int n = nums.length;int i=0;//开始进行循环while (i<n-2){//将i进行移动while (i>0&&i<n-2&&nums[i]==nums[i-1]){i++;}int j=i+1;int k=n-1;//将j和k不断逼近while (j<k){if (nums[i]+nums[j]+nums[k]<0){j++;}else if (nums[i]+nums[j]+nums[k]>0){k--;}else{//找到以后res.add(Arrays.asList(nums[i],nums[j],nums[k]));//去除j后面和k前面重复的值while (j<k&&nums[j]==nums[j+1]){j++;}while (j<k&&nums[k]==nums[k-1]){k--;}j++;k--;}}i++;}return res;}//最大子数组和//-2,1,-3,4,-1,2,1,-5,4public static int maxSubArray(int[] nums) {int n = nums.length;//建立dp数组int[] dp=new int[n];//初始化dp数组dp[0]=nums[0];int max = dp[0];//开始进行状态转移for (int i=1;i<n;i++){dp[i]=Math.max(nums[i],dp[i-1]+nums[i]);max = Math.max(dp[i],max);}return max;}//优化以后public static int maxSubArrayV2(int[] nums) {int n = nums.length;int max = nums[0];//上一个节点的最大值int temp = nums[0];//开始进行状态转移for (int i=1;i<n;i++){temp = Math.max(temp+nums[i],nums[i]);max = Math.max(temp,max);}return max;}//手撕快速排序public static int[] sortArray(int[] nums) {quickSort(nums, 0, nums.length-1);return nums;}private static void quickSort(int[] nums, int left, int right) {if (left>=right){return;}int tempV = nums[left];int i=left;int j=right;while (i<=j){if (nums[i]<=tempV){i++;}else if (nums[j]>=tempV){j--;}else{//进行交换int temp = nums[i];nums[i] = nums[j];nums[j] = temp;i++;j--;}}//开始进行优化nums[left]=nums[j];nums[j]=tempV;quickSort(nums,left,j-1);quickSort(nums,j+1,right);}//最长回文子串public static String longestPalindrome(String s) {if (s.length()==0){return "";}//获取初始长度的字符串String res = s.substring(0,1);for (int i=0;i<s.length();i++){String checkV1 = check(i, s, true);String checkV2 = check(i,s,false);if (checkV1.length()>res.length()){res = checkV1;}if (checkV2.length()> res.length()){res = checkV2;}}return res;}// cbbd//传入public static String check(int pos, String s, boolean flag){int i=pos;int j=flag?i:i+1;//判断是否符合while (i>=0&&j<s.length()){if (s.charAt(i)==s.charAt(j)){i--;j++;continue;}break;}//返回字符串return s.substring(i+1, j);}//搜索旋转排序数组-二分查找//6,7,1,2,3,4,5public static int search(int[] nums, int target) {return searchMid(nums, target, 0, nums.length-1);}//4,5,6,7,0,1,2 找 0private static int searchMid(int[] nums, int target, int left, int right) {if (left>right){return -1;}int mid = (left+right)/2;if (nums[mid]==target){return mid;}if (nums[left]<=nums[mid]){//左边有序if (nums[left]<=target&&target<nums[mid]){return searchMid(nums,target,left,mid-1);}else{return searchMid(nums,target,mid+1,right);}}else{//右边有序if (nums[mid]<target&&target<=nums[right]){return searchMid(nums,target,mid+1,right);}else{return searchMid(nums,target,left,mid-1);}}}//岛屿数量public static int numIslands(char[][] grid) {int count =0;int n=grid.length;int m=grid[0].length;//是否拜访过boolean[][] isVisited = new boolean[n][m];for (int i=0;i<n;i++){for (int j=0;j<m;j++){if (isVisited[i][j]||grid[i][j]=='0'){continue;}count++;//此时是没有拜访过的dfs(grid,isVisited,i,j);}}return count;}private static void dfs(char[][] grid, boolean[][] isVisited, int i, int j) {//设置为拜访过isVisited[i][j]=true;int n=grid.length;int m=grid[0].length;//开始进行拜访int[] xArr = new int[]{0,-1,0,1};int[] yArr = new int[]{-1,0,1,0};for (int k=0;k<4;k++){//四个方向int newX = i+xArr[k];int newY = j+yArr[k];//保证不溢出边界if (newX>=0&&newX<n&&newY>=0&&newY<m&&grid[newX][newY]=='1'&&!isVisited[newX][newY]){dfs(grid,isVisited,newX,newY);}}}//全排列public List<List<Integer>> permute(int[] nums) {//结果表List<List<Integer>> res = new ArrayList<>();List<Integer> rs = new ArrayList<>();dfs_permute(nums, 0, res);//返回最后的结果return res;}//进行递归private void dfs_permute(int[] nums, int pos, List<List<Integer>> res) {//如果位置相等的话if (pos==nums.length){List<Integer> rs = new ArrayList<>();for (int i:nums){rs.add(i);}res.add(rs);}for (int i=pos;i<nums.length;i++){//进行交换swap(nums,i,pos);dfs_permute(nums,pos+1,res);swap(nums,i,pos);}}//进行交换public static void swap(int[] nums, int i, int j){int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}//二叉树的锯齿遍历// 1//2 3public List<List<Integer>> zigzagLevelOrder(TreeNode root) {//存储值List<List<Integer>> res = new ArrayList<>();//左边出,右边进LinkedList<TreeNode> linkedList = new LinkedList<>();linkedList.offer(root);boolean flag=true;//队列不为空while (!linkedList.isEmpty()){List<Integer> rs = new ArrayList<>();int size = linkedList.size();if (flag){for (int i=0;i<size;i++) {//从头部取TreeNode node = linkedList.pollFirst();rs.add(node.val);if (node.left != null) {linkedList.offerLast(node.left);}if (node.right != null) {linkedList.offerLast(node.right);}}flag=false;}else {for (int i = 0; i < size; i++) {//从尾部取TreeNode node = linkedList.pollLast();rs.add(node.val);if (node.right != null) {linkedList.offerFirst(node.right);}if (node.left != null) {linkedList.offerFirst(node.left);}}flag=true;}res.add(rs);}//开始进行遍历return res;}//最长上升子序列public int lengthOfLIS(int[] nums) {int n = nums.length;if (n==0){return 0;}//建立dp数组int[] dp = new int[n];//初始化dp数组dp[0]=1;int max = 1;//开始进行状态转移for (int i=1;i<nums.length;i++){for (int j=i-1;j>=0;j++){//如果大于的话if (nums[i]>nums[j]){dp[i]=Math.max(dp[i],dp[j]+1);}else{dp[i]=0;}max = Math.max(max,dp[i]);}}return max;}//反转链表IIpublic ListNode reverseBetween(ListNode head, int left, int right) {ListNode leftPreNode = null;ListNode leftNode = head;ListNode rightNode = head;while (--left>0){leftPreNode=leftNode;leftNode=leftNode.next;}while (--right>0){rightNode=rightNode.next;}//记录下一个节点ListNode rightNextNode = rightNode.next;if (leftPreNode!=null){leftPreNode.next=null;}//此时进行反转ListNode newNode = reverseList_1(leftNode);//将leftNode与right下一个链接leftNode.next=rightNextNode;if (leftPreNode==null){return newNode;}leftPreNode.next=newNode;return leftPreNode;}//螺旋矩阵-可以采取一个dfspublic List<Integer> spiralOrder(int[][] matrix) {int n = matrix.length;int m = matrix[0].length;//是否拜访过boolean[][] isV = new boolean[n][m];List<Integer> res = new ArrayList<>();dfs_spiral(matrix,0,0,n,m, isV, res);return res;}//矩阵 位置 大小 是否拜访 结果private void dfs_spiral(int[][] matrix, int i, int j, int n, int m, boolean[][] isV, List<Integer> res) {//将拜访的点加入结果中res.add(matrix[i][j]);isV[i][j] = true;int[] xArr = new int[]{0,1,0,-1};int[] yArr = new int[]{1,0,-1,0};for (int k=0;k<4;k++){int newX = i+xArr[k];int newY = j+yArr[k];if (newX>=0&&newX<n&&newY>=0&&newY<m&&!isV[newX][newY]){dfs_spiral(matrix,newX,newY,n,m,isV,res);}}}public ListNode reverseList_1(ListNode head){if (head==null||head.next==null){return head;}ListNode newHead = reverseList_1(head.next);head.next.next = head;head.next=null;return newHead;}//重排链表public void reorderList(ListNode head) {ListNode slowPre = head;ListNode slow = head;ListNode quick = head;//找到中间的点while (quick!=null&&quick.next!=null){slowPre=slow;slow=slow.next;quick=quick.next.next;}//开始对后面的点进行反转if (slowPre==null){return;}//此时可以进行反转ListNode p = slow;ListNode pre = null;while (p!=null){ListNode pp=p.next;p.next=pre;pre = p;p=pp;}//此时pre为头节点ListNode node = null;p=head;while (pre!=null&&p!=null){//将节点存储node = pre;pre = pre.next;node.next=p.next;p.next=node;p=node.next;}//此时pre还多出一个节点if (pre!=null){node.next=pre;}}//字符串相加public String addStrings(String num1, String num2) {int i=num1.length()-1;int j=num2.length()-1;StringBuilder stringBuilder = new StringBuilder();int k = 0;while (i>=0&&j>=0){int res = num1.charAt(i)-48+num2.charAt(j)-48+k;stringBuilder.append(res%10);k = res / 10;i--;j--;}while (i>=0){int res = num1.charAt(i)-48+k;stringBuilder.append(res%10);k = res/10;i--;}while (j>=0){int res = num2.charAt(j)-48+k;stringBuilder.append(res%10);k = res/10;j--;}//判断k是否为0if (k!=0){stringBuilder.append(k);}return stringBuilder.toString();}//比较版本号public static int compareVersion(String version1, String version2) {//求出两个的长度int v1Len = version1.length();int v2Len = version2.length();//开始进行判断int i=0;int j=0;while (i<v1Len&&j<v2Len){//找出两个至点StringBuilder s1 = new StringBuilder();StringBuilder s2 = new StringBuilder();while (i<v1Len&&version1.charAt(i)!='.'){s1.append(version1.charAt(i));i++;}//求出两个下标对应的字符while (j<v2Len&&version2.charAt(j)!='.'){s2.append(version2.charAt(j));j++;}String sV1 = s1.toString().trim();String sV2 = s2.toString().trim();if (Integer.parseInt(sV1)<Integer.parseInt(sV2)){return -1;}if (Integer.parseInt(sV1)>Integer.parseInt(sV2)){return 1;}//将其往前移动i++;j++;}//此时i剩余if (i<v1Len){//判断后面是不是还剩余其它数for (int k=i;k<v1Len;k++){if(version1.charAt(i)!='.'&&version1.charAt(i)!='0'){return 1;}}}//此时v2剩余多if (j<v2Len){for (int k=j;j<v2Len;k++){if (version2.charAt(k)!='.'&&version2.charAt(k)!='0'){return 1;}}}return 0;}//二叉树的右视图public List<Integer> rightSideView(TreeNode root) {LinkedList<TreeNode> linkedList = new LinkedList<>();//将根节点加入至队列中linkedList.offer(root);//存储结果List<Integer> res = new ArrayList<>();//判断是否为空while (!linkedList.isEmpty()){int size = linkedList.size();for (int i=0;i<size;i++){TreeNode poll = linkedList.poll();if (i==size-1){res.add(poll.val);}if (poll.left!=null){linkedList.offer(poll.left);}if (poll.right!=null){linkedList.offer(poll.right);}}}return res;}// 1 3 5 8 12// 2 4 6 7 10//寻找两个正序数组的中位数public double findMedianSortedArrays(int[] nums1, int[] nums2) {return 0;}//删除排序链表中的重复元素//1 1public ListNode deleteDuplicates(ListNode head) {ListNode p = head;ListNode q = head;while (q!=null){if (q.val==p.val){q=q.next;}else{p.next=q;p=q;}}//还有最后一个节点p.next=null;return head;}//复原ip地址//25525511135public List<String> restoreIpAddresses(String s) {List<String> rs = new ArrayList<>();List<List<String>> res = new ArrayList<>();//第一个为位置pos,int pos = 0;dfs_restore_ip(s,pos,rs,res);return null;}private void dfs_restore_ip(String s, int pos, List<String> rs, List<List<String>> res) {if (s.length()==pos&&rs.size()==4){List<String> newRs = new ArrayList<>(rs);res.add(newRs);}//判断第一个数是不是0,是0的话直接下一个if (s.charAt(pos)=='0'){//直接加入0rs.add("0");dfs_restore_ip(s,pos+1,rs,res);}else{//从这里开始进行遍历for (int i=pos;i<pos+3;i++){//找出从pos至i+1之间的整数int in = Integer.parseInt(s.substring(pos, i + 1));//符合条件if (in>=0&&in<=255){rs.add(s.substring(pos,i+1));dfs_restore_ip(s,i+1,rs,res);}}}}//最长公共子序列public int longestCommonSubsequence(String text1, String text2) {int n= text1.length();int m = text2.length();//建立dp数组int[][] dp = new int[n][m];int max = 0;//初始化dp数组for (int i=0;i<n;i++){if (text1.charAt(i)==text2.charAt(0)){dp[i][0]=1;}max = Math.max(max,dp[i][0]);}for (int i=0;i<m;i++){if (text1.charAt(0)==text2.charAt(i)){dp[0][i]=1;}max = Math.max(max,dp[0][i]);}//开始进行状态转移for (int i=1;i<n;i++){for (int j=1;j<m;j++){if (text1.charAt(i)==text2.charAt(j)){dp[i][j]=dp[i-1][j-1]+1;}else{dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1]);}max=Math.max(max,dp[i][j]);}}return max;}//找出最大直径int max = 0;//二叉树的最大路径和 找出一root为根的最大路径和public void maxPathSum(TreeNode root) {if (root==null){return;}max = Math.max(max, getHeight(root.left)+getHeight(root.right)+1);maxPathSum(root.left);maxPathSum(root.right);}//获取节点最大深度public int getHeight(TreeNode root){if (root==null){return 0;}return Math.max(getHeight(root.left),getHeight(root.right))+1;}//[["1","1","0","0","0"],["1","1","0","0","0"],["0","0","1","0","0"],["0","0","0","1","1"]]//[["1","1","0","0","0"],["1","1","0","0","0"],["0","0","1","0","0"],["0","0","0","1","1"]]public static void main(String[] args) {int i = compareVersion("1.01", "1.001");System.out.println(i);}
}