最短无序连续子数组(在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...中找到第 n 个数字。)

在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...中找到第 n 个数字。
注意:
n 是正数且在32为整形范围内 ( n < 231)。

示例 1:
输入:
3
输出:
3

示例 2:
输入:
11
输出:
0
说明:
第11个数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是0,它是10的一部分。

 

public class test {
    public static void main(String[] args) {
        Solution s = new Solution();
        int n = 200;
        int a = s.findNthDigit(n);
        System.out.println(a);
    }
}

class Solution {
    public int findNthDigit(int n) {
        int i=0;
        int res=0;
        int temp=n;
        //判断n为几位数字
        while(temp > 9*Math.pow(10,i)*(i+1)){//i+1位数共有多少个数字
            temp -= 9*Math.pow(10,i)*(i+1);
            i++;
        }

        for(int j=0;j<i;j++){
            res += 9*Math.pow(10,j);
        }
        res += temp/(i+1);//得到数字包含第n个数字
        if(temp%(i+1)==0)
            return Integer.parseInt((res+"").charAt(i)+"");
        else
            return Integer.parseInt(((res+1)+"").charAt(temp%(i+1)-1)+"");
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来给你讲一下归并排序的实现过程。 归并排序是一种分治算法,它的基本思想是将一个大问题分解成若干个问题,先解决问题,再将问题的解合并起来得到原问题的解。具体来说,归并排序的实现过程如下: 1. 将序列分成两个长度相等的序列,分别对它们进行排序。 2. 将两个排好序的序列合并成一个有序序列。 对于第一步,可以采用递归的方法来实现。具体来说,可以将序列分成左右两个序列,对左右两个序列分别进行排序,然后将排好序的左右两个序列合并成一个有序序列。 对于第二步,可以采用双指针的方法来实现。具体来说,可以使用两个指针分别指向左右两个序列的起始位置,比较两个指针所指的元素,将较小的元素放入临时数组,直到其一个序列被遍历完为止,然后将剩余的元素依次放入临时数组。 最后,将临时数组的元素复制回原数组即可。 下面是用归并算法实现排序的代码实现(使用C语言): ```c #include <stdio.h> void merge(int arr[], int left, int mid, int right) { int i = left, j = mid + 1, k = 0; int temp[right - left + 1]; while (i <= mid && j <= right) { if (arr[i] <= arr[j]) { temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; } } while (i <= mid) { temp[k++] = arr[i++]; } while (j <= right) { temp[k++] = arr[j++]; } for (i = left, k = 0; i <= right; i++, k++) { arr[i] = temp[k]; } } void merge_sort(int arr[], int left, int right) { if (left < right) { int mid = (left + right) / 2; merge_sort(arr, left, mid); merge_sort(arr, mid + 1, right); merge(arr, left, mid, right); } } int main() { int arr[10] = {4, 3, 1, 2, 6, 5, 0, 9, 8, 7}; int n = sizeof(arr) / sizeof(int); merge_sort(arr, 0, n - 1); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; } ``` 希望能对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值