2022-3-3 剑指offer day21
题1:
JZ44 数字序列中某一位的数字
描述
数字以 0123456789101112131415... 的格式作为一个字符序列,在这个序列中第 2 位(从下标 0 开始计算)是 2 ,第 10 位是 1 ,第 13 位是 1 ,以此类题,请你输出第 n 位对应的数字。
数据范围: 0 \le n \le 10^9 \0≤n≤109
1 import java.util.*; 2 3 4 public class Solution { 5 /** 6 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 7 * 8 * 9 * @param n int整型 10 * @return int整型 11 */ 12 public int findNthDigit (int n) { 13 // write code here 14 int[] arr={9,189,2889,38889,488889,5888889,68888889,788888889}; 15 int index=-1; 16 if (n<10) return n; 17 while (index+1<=7&&n>arr[index+1]) index++; 18 if (index==8) { 19 n-=arr[7]; 20 }else n-=arr[index]; 21 int s=n/(index+2); 22 n-=s*(index+2); 23 int num=0,ans=0; 24 //System.out.print(n); 25 //System.out.print(s); 26 if (n==0) { 27 num=(int)Math.pow(10,index+1)+s-1; 28 ans=num%10; 29 //System.out.print(num); 30 }else { 31 num=(int)Math.pow(10,index+1)+s; 32 //System.out.println(num); 33 for (int i=0;i<index+2-n;i++) num=num/10; 34 ans=num%10; 35 } 36 //System.out.print(index); 37 return ans; 38 } 39 }
思路:找规律,先判断几位数,在具体找数的位数。
题2:
JZ42 连续子数组的最大和
描述
输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组,子数组最小长度为1。求所有子数组的和的最大值。
数据范围:
1 <= n <= 2\times10^51<=n<=2×105
-100 <= a[i] <= 100−100<=a[i]<=100
要求:时间复杂度为 O(n)O(n),空间复杂度为 O(n)O(n)
进阶:时间复杂度为 O(n)O(n),空间复杂度为 O(1)O(1)
1 public class Solution { 2 public int FindGreatestSumOfSubArray(int[] array) { 3 int ans=array[0]; 4 int f=array[0]; 5 for (int i=1;i<array.length;i++) { 6 int temp=Math.max(array[i],f+array[i]); 7 //System.out.println(temp); 8 ans=Math.max(temp,ans); 9 //System.out.println(ans); 10 f=temp; 11 } 12 return ans; 13 } 14 }
思路:动态规划,f表示以i结尾的子数组最大值。因为只跟前面的f有关,所以可以一个数代替。