【剑指offer】31-40题

本文主要解析了剑指Offer中的部分题目,包括求连续子数组最大和、计算1在数字n中出现的次数、找最小数字排列、求第N个丑数、定位字符串中首次出现一次的字符、计算逆序对数量、找两个链表的公共节点、统计排序数组中数字出现次数、二叉树的深度和判断平衡二叉树,以及找出数组中出现一次的两个数字。通过算法思路和代码实现进行详细解答。
摘要由CSDN通过智能技术生成

31.求连续子数组(包含负数)的最大和

思路:若和小于0,则将最大和置为当前值,否则计算最大和。

代码实现

    public int FindGreatestSumOfSubArray(int[] array) {
   
        if (array == null || array.length == 0)
            return 0;
        int cur = array[0];
        int greast = array[0];

        for (int i = 1; i < array.length; i++) {
   
            if (cur < 0) {
   
                cur = array[i];
            }else {
   
                cur += array[i];
            }

            if (cur > greast) {
   
                greast = cur;
            }
        }
        return greast;
    }

32.从1到非负整数n中1出现的次数

思路:若百位上数字为0,百位上可能出现1的次数由更高位决定;若百位上数字为1,百位上可能出现1的次数不仅受更高位影响还受低位影响;若百位上数字大于1,则百位上出现1的情况仅由更高位决定

代码实现

    public long CountOne2(long n) {
   
        long count = 0; // 1的个数
        long i = 1;  // 当前位
        long current = 0,after = 0,before = 0;

        while((n / i) != 0) {
   
            before = n / (i * 10); // 高位
            current = (n / i) % 10; // 当前位
            after = n - (n / i) * i;  // 低位

            if (current == 0)
                //如果为0,出现1的次数由高位决定,等于高位数字 * 当前位数
                count = count + before * i;
            else if(current == 1)
                //如果为1,出现1的次数由高位和低位决定,高位*当前位+低位+1
                count = count + before * i + after + 1;
            else if (current > 1)
                // 如果大于1,出现1的次数由高位决定,(高位数字+1)* 当前位数
                count = count + (before + 1) * i;
            //前移一位
            i = i * 10;
        }
        return count;
    }

解法二:公式法

    public int NumberOf1Between1AndN_Solution(int n){
   
        int count=0;

        for(int i = 1; i <= n; i *= 10){
   
            int a = n / i; // 高位
            int b = n % i; // 低位
            count += (a+8) / 10 * i;
            if(a % 10 == 1){
   
                count += b + 1;
            }
        }
        return count;
    }

33.输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个

思路:先将整型数组转换成String数组,然后将String数组排序,最后将排好序的字符串数组拼接出来。关键就是制定排序规则。或使用比较和快排的思想,将前面的数和最后的数比较,若小则放到最前面,最后再递归调用。

代码实现

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值