LeetCode上做题之体会(一)

2023-05-16

今天做到一道题是这样的:Ugly Number

Write a program to check whether a given number is an ugly number.
Ugly numbers are positive numbers whose prime factors only include 2, 3, 5. For example, 6, 8 are ugly while 14 is not ugly since it includes another prime factor 7.
Note that 1 is typically treated as an ugly number.

可能是因为本人的英语水平不过关,一开始都Get不到这道题想要表达什么,最后想了挺久的才想到,原来这就是一个小学生的题目,这个丑数字原来就是不是纯(2,3,5)的倍数的数字就是了。害我想那么久。
好了知道思路之后就简单了,下面贴一下我的代码:

    public boolean isUgly(int num) {
        if(num == 0) return false;
        while(num % 5 == 0) num /= 5;
        while(num % 3 == 0) num /= 3;
        while(num % 2 == 0) num /= 2;
        if(num == 1) return true;
        return false;
    }

好了,这题真的是没什么难的,重在理解好吧。
但是在这里我要提一下,上面while中的顺序是有一点道理的,这样排下来要是给的num大的话,可以减少循环的次数。


一道简单的合并有序链表的题目:Merge Two Sorted Lists

Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.

先给一下我自己的代码:

    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode newl,temp;
        if(l2 == null) return l1;
        if(l1 == null) return l2;
        if(l1.val <= l2.val){
            temp = l1;
            l1 = l1.next;
        }
        else{
            temp = l2;
            l2 = l2.next;
        }
        newl = temp;
        while(l1 != null || l2 != null){
            if(l1 == null){
                temp.next = l2;
                break;
            }
            if(l2 == null){
                temp.next = l1;
                break;
            }
            if(l1.val <= l2.val){
                temp.next = l1;
                l1 = l1.next;
            }
            else{
                temp.next = l2;
                l2 = l2.next;
            }
            temp = temp.next;
        }
        return newl;
    }

我上面的做法是一般人都会想到的,其实我上面的代码还可以再省去一个链表指针的。(这里需要提醒大家的是,不要忘记提前判空喔,少了这个这个可是会报错的。)
然而以下是很简洁的代码,这是一个递归的方法:

public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
    if (l1 == null) return l2;
    if (l2 == null) return l1;
    ListNode head = l1.val < l2.val ? l1 : l2;
    ListNode nonHead = l1.val < l2.val ? l2 : l1;
    head.next = mergeTwoLists(head.next, nonHead);
    return head;
}

这是另外一道合并有序数组的题目:Merge Sorted Array

Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.
Note:
You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2. The number of elements initialized in nums1 and nums2 are m and n respectively.

我一开始想到的一下的办法:

    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int t;
        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                if(nums1[i] > nums2[j]){
                    t = nums1[i];
                    nums1[i] = nums2[j];
                    nums2[j] = t;
                }
            }
        }
        Arrays.sort(nums2);
        for(int i = m, j = 0; i < m + n; i++,j++){
            nums1[i] = nums2[j];
        }
    }

我的方法是从前面开始遍历,这样的方法在这道题中会显得比较差,首先事件复杂度就大了。
所以下面给出一个从后面开始比较的方法,这样的方法比较比上面的,在时间复杂度上就优化的好多。

public void merge(int[] nums1, int m, int[] nums2, int n) {
    int l = m+n-1;
    m--;
    n--;
    while (m >= 0 && n >= 0) {
        if (nums1[m] > nums2[n]) {
            nums1[l] = nums1[m];
            l--;
            m--;
        } else {
            nums1[l] = nums2[n];
            l--;
            n--;
        }
    }
    for (int i = 0; i <= n; i++) {
        nums1[i] = nums2[i];
    }
}

一段让我很佩服的递归代码:

题目:Swap Nodes in Pairs
内容:Given a linked list, swap every two adjacent nodes and return its head.
For example,
Given 1->2->3->4, you should return the list as 2->1->4->3.
要求:Your algorithm should use only constant space. You may not modify the values in the list, only nodes itself can be changed.(意思就是不要直接修改链表中的值)。

    public ListNode swapPairs(ListNode head) {
        if ((head == null)||(head.next == null))
            return head;
        ListNode n = head.next;
        head.next = swapPairs(head.next.next);
        n.next = head;
        return n;
    }

我当时要看懂这个递归花了好多时间,按照递归的定义一步一步拆出来才能理解,真心让我佩服的一段代码。

回文数的一个很好算法:

原题目:Palindrome Number
 Determine whether an integer is a palindrome. Do this without extra space.

下面是个好方法:

    public boolean isPalindrome(int x) {
        if(x != 0 && x % 10 == 0) return false;
        int finhalf = 0;
        while(x >finhalf){
            finhalf = finhalf * 10 + x % 10;
            x /= 10;
        }
        return x == finhalf || x == finhalf / 10;
    }

本来按照正常的思路我们应该会把一个一个将对称的数字进行比较,可是这个算法的思维比较“发散”直接将这个数分成两半,另这两半直接比较。这确实能省时间和不用额外的空间开销。

LeetCode中里面还有好多很有意思的递归,以后有看到会继续在这里分享。
本篇博文已经太长了,下一篇请看:LeetCode上做题之体会(二)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode上做题之体会(一) 的相关文章

  • 22.Ubuntu出现“由于没有公钥,无法验证下列签名”

    由于没有公钥 xff0c 无法验证下列签名 1 无公钥错误2 输入命令导入公钥3 注意 1 无公钥错误 使用sudo apt update时出现以下错误 xff1a 我图中的公钥就是 xff1a 3B4FE6ACC0B21F32 xff08
  • nyist 27 水池数目(dfs搜索)

    xfeff xfeff 水池数目 时间限制 xff1a 3000 ms 内存限制 xff1a 65535 KB 难度 xff1a 4 描述 南阳理工学院校园里有一些小河和一些湖泊 xff0c 现在 xff0c 我们把它们通一看成水池 xff
  • XTUOJ 1176 I Love Military Chess(模拟)

    xfeff xfeff I Love Military Chess Accepted 45 Submit 141Time Limit 1000 MS Memory Limit 65536 KB 题目描述 陆军棋 xff0c 又称陆战棋 xf
  • 数据结构课程设计之一元多项式的计算

    数据结构不是听会的 xff0c 也不是看会的 xff0c 是练会的 xff0c 对于写这么长的代码还是心有余也力不足啊 xff0c 对于指针的一些操作 xff0c 也还是不熟练 xff0c 总出现一些异常错误 xff0c 对于数据结构掌握还
  • Unity官方文档(英文)

    地址 xff1a https docs unity3d com Manual UnityManual html
  • 数据结构课程设计之通讯录管理系统

    数据结构的第二个课程设计 xff0c 在c语言课程设计的基础上加以改进 xff0c xff08 加强版 xff09 xff0c 保存一下代码 xff0c 对文件的处理 xff0c 还是有一点一问题 xff0c 还有待改进 include l
  • 在网页中添加音乐

    最近在折腾一个网页 xff0c 对于一个有强迫症的人来说 xff0c 就想在网页中插入音乐 xff0c xff08 当做背景音乐 xff09 xff0c 然后自己百度了好多资料 xff1b 就在这里总结一下 xff1a 第一步 xff1a
  • nyist oj 214 单调递增子序列(二) (动态规划经典)

    单调递增子序列 二 时间限制 xff1a 1000 ms 内存限制 xff1a 65535 KB 难度 xff1a 4 描述 给定一整型数列 a1 a2 an xff08 0 lt n lt 61 100000 xff09 xff0c 找出
  • 思科CCNA第一学期期末考试答案

    1 第 3 层头部包含的哪一项信息可帮助数据传输 xff1f 端口号 设备物理地址 目的主机逻辑地址 虚拟连接标识符 2 IP 依靠 OSI 哪一层的协议来确定数据包是否已丢失并请求重传 xff1f 应用层 表示层 会话层 传输层 3 请参
  • hexo博客出现command not found解决方案

    由于前一段时间忙于考试 xff0c 也有好久没有去更新博客了 xff0c 今天去添加友链的时候 xff0c 突然发现用不了了 xff0c 出现了conmand not found的提示 xff1a 按照字面上的翻译就是 找不到所使用的命令
  • 思科CCNA第二学期期末考试答案

    1 关于数据包通过路由器传输时的封装和解封的叙述 xff0c 下列哪三项是正确的 xff1f xff08 选择三项 xff09 路由器修改 TTL 字段 xff0c 将其值减 1 路由器将源 IP 更改为送出接口的 IP 路由器保持相同的源
  • Hexo版本升级和Next主题升级之坑

    缘起 差不多用了一年hexo的3 2 0版本 xff0c next主题版本也用的5 0的 xff0c 本来用的好好的 xff0c 但是最近访问其他人的博客 xff0c 发现访问速度比我的提升了不止一点点 xff0c 遂决定折腾一番 过程 H
  • Python中JSON的基本使用

    JSON JavaScript Object Notation 是一种轻量级的数据交换格式 Python3 中可以使用 json 模块来对 JSON 数据进行编解码 xff0c 它主要提供了四个方法 xff1a dumps dump loa
  • 卷积和快速傅里叶变换(FFT)的实现

    卷积运算 卷积可以说是图像处理中最基本的操作 线性滤波通过不同的卷积核 xff0c 可以产生很多不同的效果 假如有一个要处理的二维图像 xff0c 通过二维的滤波矩阵 xff08 卷积核 xff09 xff0c 对于图像的每一个像素点 xf
  • 每个程序员和设计师可做的10项运动

    本文转载自 码农网 程序员 和设计师大部分时间都坐在电脑前 有效的锻炼有助于他们更好地工作 传统的 xff1a 当坐在电脑桌前的时候 脚触地 双手在肘部弯曲 打字时手应搁在桌子上 键盘和鼠标应在触手可及的地方 显示屏应在视线水平上 xff0
  • OKhttpUtils

    public class OkUtils static final int GET EXCUTE 61 111 static final int GET ENQUEUE 61 222 static final int POST EXCUTE
  • 性能调优之JMH必知必会4:JMH的高级用法

    性能调优之JMH必知必会4 xff1a JMH的高级用法 JMH必知必会系列文章 xff08 持续更新 xff09 一 前言二 JMH的高级用法1 添加JMH依赖包2 Asymmetric Benchmark3 Interrupts Ben
  • 性能调优之JMH必知必会5:JMH的Profiler

    性能调优之JMH必知必会5 xff1a JMH的Profiler JMH必知必会系列文章 xff08 持续更新 xff09 一 前言二 JMH的Profiler1 添加JMH依赖包2 StackProfiler3 GcProfiler4 C
  • 性能调优之JMH必知必会3:编写正确的微基准测试用例

    性能调优之JMH必知必会3 xff1a 编写正确的微基准测试用例 JMH必知必会系列文章 xff08 持续更新 xff09 一 前言二 编写正确的微基准测试用例1 添加JMH依赖包2 避免DCE xff08 Dead Code Elimin
  • 写最好的最新Redis6(redis-6.2.7)在云服务器Centos7安装部署教程(参考官方文档)

    一 前言 Redis官方下载地址 xff1a https redis io download redis downloads 本教程参考官方文档 xff0c 在云服务器Centos7上安装部署 Redis6 最新版 Redis 6 2 7

随机推荐