LeetCode剑指Offer刷题总结(五)

  • 限制: 1 <= n < 2^31< code><!--=-->

数字范围较大,暴力会超时

class Solution {
    public int countDigitOne(int n) {
        int sum = 0;
        int cur = n%10, digit = 1, high = n/10 , low = 0;
        while(cur != 0 || high != 0){
            if(cur==0) sum += high*digit;
            else if(cur == 1) sum+= high*digit + low + 1;
            else sum+= high*digit + digit;
            low = cur*digit + low;
            cur = high %10;
            high = high /10;
            digit *=10;
        }
        return sum;
    }
}

本题的思路很精巧,可以试着思考行李箱上的密码锁,确定每个数位为1的情况有多少种。

当前位为0,意味着假如说 2301,则只有0010-2219的数字是符合条件的,这里面有229+1个情况。

当前位为1,假如说 2314,则只有0010-2314是符合条件的,234+1个情况。

当前位大于1,假如说2334,则有0010-2319是符合条件的,239+1个情况。

这里的思想并不麻烦,但是要注意每个数位的处理过程,很可能少减一次1,结果就截然不同了。

class Solution {
    public int findNthDigit(int n) {
        int digit = 1;
        long start = 1;
        long count = 9;
        while (n > count) { // 1.

            n -= count;
            digit += 1;
            start *= 10;
            count = digit * start * 9;
        }
        long num = start + (n - 1) / digit; // 2.

        return Long.toString(num).charAt((n - 1) % digit) - '0'; // 3.

    }
}

2,3步中的-1需要仔细理解。

class Solution {
    public String minNumber(int[] nums) {
        String[] res1 = new String[nums.length];
        for(int i = 0 ; i(x+y).compareTo(y+x));
        StringBuilder res = new StringBuilder();
        for(String s : res1)
            res.append(s);
        return res.toString();
    }
}

该题其实就是一个快速排序,只是需要将判断条件由(x,y)->(x-y)升序 改为 (x,y)-> (x+y).compareTo(y+x) (该内容为字符串比较)。该方式为lamda表达式。

class Solution {
    public String minNumber(int[] nums) {
        String[] res1 = new String[nums.length];
        for(int i = 0 ; i=r) return ;
        int i = l , j = r;
        String tmp = str[l];
        while(i=0 && i

快排完整版

class Solution {

    int count = 0;

    public int translateNum(int num) {
        dfs(String.valueOf(num));
        return count;
    }

    public void dfs(String s) {
        if(s.length()

这题的思路也是比较简单,DFS即可。树形递归的时间复杂度在O(2^N)

动态规划解法:

public int translateNum(int num) {
        String s = String.valueOf(num);
        int a = 1, b = 1;
        for(int i = 2; i = 0 && tmp.compareTo("25")

a为dp0,b为dp1。

典型的动态规划

每次状态为向上一步的最优值或者向左一步最优值的最大者。

class Solution {
    public int maxValue(int[][] grid) {
        int m = grid.length, n = grid[0].length;
        for(int i = 0 ; i < m ; i++)
            for(int j = 0 ; j < n ; j++) {
                if(i==0 && j==0) continue;
                else if(i==0) grid[i][j]+=grid[i][j-1];
                else if(j==0) grid[i][j]+=grid[i-1][j];
                else{
                    grid[i][j] = Math.max(grid[i][j]+grid[i][j-1], grid[i][j]+grid[i-1][j]);
                }
            }
        return grid[m-1][n-1];
    }
}

动态规划,其中利用了hash表标记元素位置

class Solution {
    public int lengthOfLongestSubstring(String s) {
        Map map = new HashMap<>();
        int tmp = 0, res = 0;
        for(int i = 0 ; i < s.length() ; i++) {
            int j = map.getOrDefault(s.charAt(i),-1);
            map.put(s.charAt(i),i);
            tmp = tmp < i-j ? tmp+1 : i-j;
            res = res > tmp ? res : tmp;
        }
        return res;
    }
}

假设字符串abcab,则循环到a时,检测到0位置上为重复元素,判断tmp为3,i-j即当前元素距重复元素距离3,则说明子串中含有a,更新为i-j。

class Solution {
    public int nthUglyNumber(int n) {
        int[] factor = {2,3,5};
        int ans=0;
        Set set =  new HashSet<>() {{add(1L);}};
        PriorityQueue res = new PriorityQueue<>() {{offer(1L);}};
        for(int i = 1 ; i

注意,题目只要求包含质因子2,3,5,因此必须用每个丑数再乘2,3,5获取新的丑数,并判断不重复,PriorityQueue不会自动判别重复元素。

利用哈希表遍历

class Solution {
    public char firstUniqChar(String s) {
        char res =' ';
        if(s.length()==0)
            return ' ';
        Map map = new HashMap<>();
        for(int i = 0 ; i < s.length() ; i++) {
            if(map.getOrDefault(s.charAt(i),-1)==-1)
                map.put(s.charAt(i),0);
            else map.put(s.charAt(i),1);
        }
        for(int i = 0 ; i < s.length() ; i++) {
            if(map.get(s.charAt(i))==0) {
                res = s.charAt(i);
                break;
            }
        }
        return res;
    }
}
class Solution {
    int[] tmp;
    public int reversePairs(int[] nums) {
        int len = nums.length;
        tmp = new int[len];
        return mergeSort(nums,0,len-1);
    }

    public int mergeSort(int[] nums, int l, int r) {
        if(l>=r)
            return 0;
        int m = (l+r)/2, i = l, j = m+1;
        int res = mergeSort(nums,l,m) + mergeSort(nums,m+1,r);
        for(int k = l ; k

在归并的每一步合并中,进行逆序对计数。注意各个临界点的判断。

利用哈希表遍历,要善于利用hashset和map,但是要注意.equal的实现机制。

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        Set set = new HashSet<>();
        while(headA!=null){
            set.add(headA);
            headA = headA.next;
        }
        while(headB!=null){
            if(!set.add(headB))
                break;
            headB = headB.next;
        }
        return headB;
    }
}

Original: https://www.cnblogs.com/gaoyuan206/p/15411637.html
Author: GaoYuan206
Title: LeetCode剑指Offer刷题总结(五)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/578960/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • SpringBoot 配置跨域 和版本问题

    SpringBoot 配置跨域 和版本问题 使用 springboot版本:2.3.6.RELEASE、2.4.2、2.7.4 使用返回新的过滤器报错!!! 报错信息: Illeg…

    Java 2023年6月7日
    069
  • LeetCode题解—-两数之和

    给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答…

    Java 2023年6月6日
    078
  • 函数式数据结构-列表

    在开始之前我们先了解几个名词: 1、什么是函数式编程:函数式编程属于”结构化编程”的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用,可以说是面向过程…

    Java 2023年6月9日
    077
  • nginx日志分析解决方案- Awstats

    很多PHP搭建的网站都在由apache转向了nginx。nginx的日志信息如何分析呢? 当然你可以自己写一个,但是这里也推荐一款结果信息非常详尽的开源工具——Awstats ,它…

    Java 2023年5月30日
    086
  • MySQLB+树

    书名《MySQL是怎样运行的:从根儿上理解MySQL》。 这本书讲得真的很好,建议大家想学习的去看看😊 本文是基于我的认识上将InnoDB的结构进行的回想,查缺补漏。 InnoDB…

    Java 2023年6月16日
    087
  • bat脚本的写法

    当你每次都要输入相同的命令时,可以把这么多命令存为一个批处理,从此以后,只要运行这个批处理,就相当于打了几行、几十行命令。下面以Nginx服务的停止脚本为例写一个bat批处理文件:…

    Java 2023年6月16日
    066
  • 对于程序员来说,怎样才算是在写有“技术含量”的代码?

    你好呀,我是歪歪。 我最近其实在思考一个问题: 对于程序员来说,怎样才算是在写有”技术含量”的代码? 为什么会想起思考这个看起来就很厉(装)害(逼)的问题呢…

    Java 2023年6月5日
    081
  • maven基础入门

    maven翻译为”专家”,”内行”。Maven是Apache下的一个纯java开发的开源项目,它是一个项目管理工具,使用maven对…

    Java 2023年6月9日
    070
  • 注解和反射

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月7日
    085
  • 3、关注、取消关注 与 关键字回复

    上一篇结尾已经说了关注(取消) 与 普通消息发送区别,所以程序更改如下就可以实现关注、取消关注 与 关键字回复三种不同处理 java;html-script:false;quick…

    Java 2023年6月13日
    0123
  • 动态规划—摘花生

    Hello Kitty想摘点花生送给她喜欢的米老鼠。 她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来。 地里每个道路的交叉点上都有种着一株花生苗,上面有若干…

    Java 2023年6月7日
    095
  • 转载:多核平台下的JAVA优化

    现在多核CPU是主流。利用多核技术,可以有效发挥硬件的能力,提升吞吐量,对于Java程序,可以实现并发垃圾收集。但是Java利用多核技术也带来了一些问题,主要是多线程共享内存引起了…

    Java 2023年5月29日
    074
  • 8种方法提升windows 8使用方便—–Win+x 编辑菜单

    在windows 8上,你可以同时按下windows键和x键或者右键点击屏幕左下角打开一个菜单名为电源菜单或者快速访问菜单,这个菜单包含快速访问系统的工具,如控制面板,命令提示符,…

    Java 2023年6月7日
    094
  • 单机高并发模型设计

    背景 在微服务架构下,我们习惯使用多机器、分布式存储、缓存去支持一个高并发的请求模型,而忽略了单机高并发模型是如何工作的。这篇文章通过解构客户端与服务端的建立连接和数据传输过程,阐…

    Java 2023年6月8日
    0101
  • MongoDB简述

    MongoDB is an open-source document database that provides high performance, high availabil…

    Java 2023年6月7日
    0115
  • i++和++i

    ++ 是 自增运算符 不给变量赋值 最后 i 的值都是一样的 给变量赋值 i++先赋值 后自增 ++i 先自增 后赋值 不能理解请 一条++操作配合一条输出语句 其他6条注释掉 执…

    Java 2023年6月8日
    083
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球