LeetCode(五)

  1.  

    1. 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;
          }
      }
  2.  

     

    1. 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;
          }
      }
  3.  

     

    1. 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]};
      
          }
      }

       

        

       

posted @ 2021-09-01 00:40  张紫韩  阅读(43)  评论(0编辑  收藏  举报