LeetCode(五)
-
-
package com.model.string; import org.omg.PortableInterceptor.INACTIVE; import java.util.HashMap; /** * @Description:测试类 * @Author: 张紫韩 * @Crete 2021/8/31 23:11 * 给你两个字符串,找到同源异构字符串 * acbd 和abc 即 acb为abc的同源异构字符串 */ public class StringDemo01 { public static void main(String[] args) { String str1="fasdfsdabcdefg"; String str2="bca"; System.out.println(getIndex(str1, str2)); System.out.println(getIndex2(str1, str2)); } // 窗口移动+记账法 public static int getIndex2(String str1,String str2){ if (str1.length()<str2.length()||str2.length()==0){ return -1; } int[] table=new int[256]; // 无效还款数 int invalid=0; // 形成账单 for (int i = 0; i < str2.length(); i++) { table[str2.charAt(i)]++; } // 先行成第一个窗口 for (int i = 0; i < str2.length(); i++) { if (table[str1.charAt(i)]==0){ invalid++; } table[str1.charAt(i)]--; } if (invalid==0){ return 0; } for (int i = 0;i < str1.length()-str2.length()+1; i++) { // 判断是否已经全部还款,且无效还款为0 if (invalid==0){ return i; } // 滑动窗口 if (table[str1.charAt(i)]++<0){ invalid--; } if (table[str1.charAt(i+str2.length())]--==0){ invalid++; } } return -1; } //普通方法,列举出所有的和str2一样长的字串进行比对 public static int getIndex(String str1,String str2){ for (int i = 0; i < str1.length()-str2.length()+1; i++) { if (isTY(str1.substring(i, i+str2.length()), str2)){ return i; } } return -1; } // 判断两个字符串是否是同源字符串 public static boolean isTY(String str1,String str2){ int[] table=new int[256]; for (int i = 0; i < str2.length(); i++) { table[str2.charAt(i)]++; } for (int i = 0; i < str1.length(); i++) { if (table[str1.charAt(i)]==0){ return false; } table[str1.charAt(i)]--; } return true; } }
-
-
-
package com.model.number; import java.util.Arrays; /** * @Description:测试类 * @Author: 张紫韩 * @Crete 2021/9/1 22:37 * 给你一个长度N,建立长度为N的数组 * 对于任意位置的数组都满足 i<k<j * arr[i]+arr[j]!=2*arr[k]
* master公式确定递归的过程的时间复杂度
T(N)=a * T(N/b)+T(N^d)
logba<d 时时间复杂度时: O(N^d)
logba>d 时时间复杂度时: T(N^logba)
logba=d 时时间复杂度时: T(N^d*logN)
*/ public class NumberDemo05 { public static void main(String[] args) { int[] arr = buildArr(5); System.out.println(Arrays.toString(arr)); } public static int[] buildArr(int size){ if (size==1){ return new int[]{1}; } // 对原数组进行奇变换 int[] buildArr = buildArr(size/2+size%2); int[] resInt = new int[size]; int index=0; for (int i=0; i < buildArr.length; i++) { resInt[index++]=buildArr[i]*2-1; } // 对原数组进行偶变换 for (int i=0; index<size; i++) { resInt[index++]=buildArr[i]*2; } // 将量个都满足条件的数组合并,原来的数组就扩到了一倍 return resInt; } }
-
-
-
package com.model.array; import java.util.Arrays; /** * @Description:测试类 * @Author: 张紫韩 * @Crete 2021/9/2 0:14 * 数组arr,数组中任意两个数组合成数值对,对数据对进行排序,从小到大 * 找到下标为K个的数据对 */ public class ArrayDemo08 { public static void main(String[] args) { int[] arr={1,2,2,3}; System.out.println(Arrays.toString(findArr(arr, 5))); } public static int[] findArr(int[] arr,int k){ // 进行排序 Arrays.sort(arr); int len = arr.length; // 找到对应的下标,所产生的数 int index1=k/len; int right = index1; int left = index1; int temp=0; for (int i = 0; i < len; i++) { if (arr[i]==arr[index1]){ right=i; temp++; } } left=right-(temp-1); int count=k-len*left; int index2=count/temp; return new int[]{arr[index1],arr[index2]}; } }
-