怒刷LeetCode的第6天(Java版)

news2025/1/12 20:49:45

目录

第一题

题目来源

题目内容

解决方法

方法一:哈希表

方法二:逐个判断字符

方法三:模拟减法

第二题

题目来源

题目内容

解决方法

方法一:水平扫描法

方法二:垂直扫描法

方法三:分治法

方法四:二分查找

第三题

题目来源

题目内容

解决方法

方法一:双指针


第一题

题目来源

13. 罗马数字转整数 - 力扣(LeetCode)

题目内容

解决方法

方法一:哈希表

根据题目要求,我们需要将给定的罗马数字转换成整数。根据题目中给出的规则,我们可以逐个字符判断并累加得到最终的整数表示。

具体的步骤如下:

  • 初始化一个变量result为0,表示最终的整数结果。
  • 遍历给定的罗马数字字符串s,从左往右逐个字符判断:
  1. 如果当前字符的值比下一个字符的值小,则需要执行减法操作。根据题目中的特殊规则,可以判断当前字符的值是负数。将该负数加到result上,并跳过下一个字符。
  2. 否则,直接将当前字符的值加到result上。
  • 返回result作为最终的整数表示。
class Solution {
    public int romanToInt(String s) {
    Map<Character, Integer> romanMap = new HashMap<>();
    romanMap.put('I', 1);
    romanMap.put('V', 5);
    romanMap.put('X', 10);
    romanMap.put('L', 50);
    romanMap.put('C', 100);
    romanMap.put('D', 500);
    romanMap.put('M', 1000);

    int result = 0;
    for (int i = 0; i < s.length(); i++) {
        int value = romanMap.get(s.charAt(i));
        if (i < s.length() - 1 && value < romanMap.get(s.charAt(i + 1))) {
            result -= value;
        } else {
            result += value;
        }
    }

    return result;
}

}

复杂度分析:

  • 时间复杂度:O(n),其中n是给定的罗马数字字符串的长度。遍历一次罗马数字字符串,每个字符只被访问一次。
  • 空间复杂度:O(1)。虽然我们使用了一个哈希表来存储罗马数字字符与对应的数值映射关系,但是由于罗马数字字符数量有限且固定,因此哈希表的大小是恒定不变的,可以视为常数级别的空间复杂度。除此之外,我们并没有使用任何额外的数据结构。

LeetCode运行结果:

方法二:逐个判断字符

除了使用哈希表的方法,还可以使用逐个判断字符的方法来将罗马数字转换成整数。

具体的步骤如下:

  1. 初始化一个变量result为0,表示最终的整数结果。

  2. 遍历给定的罗马数字字符串s,从左往右逐个字符判断:

    • 如果当前字符是'I',并且下一个字符是'V'或'X',则需要执行减法操作,将4或9加到result上,并跳过下一个字符。

    • 如果当前字符是'X',并且下一个字符是'L'或'C',则需要执行减法操作,将40或90加到result上,并跳过下一个字符。

    • 如果当前字符是'C',并且下一个字符是'D'或'M',则需要执行减法操作,将400或900加到result上,并跳过下一个字符。

    • 否则,直接将当前字符的值加到result上。

  3. 返回result作为最终的整数表示。

class Solution {
    public int romanToInt(String s) {
    int result = 0;
    for (int i = 0; i < s.length(); i++) {
        char currentChar = s.charAt(i);
        if (currentChar == 'I' && i < s.length() - 1 && (s.charAt(i + 1) == 'V' || s.charAt(i + 1) == 'X')) {
            result -= 1;
        } else if (currentChar == 'X' && i < s.length() - 1 && (s.charAt(i + 1) == 'L' || s.charAt(i + 1) == 'C')) {
            result -= 10;
        } else if (currentChar == 'C' && i < s.length() - 1 && (s.charAt(i + 1) == 'D' || s.charAt(i + 1) == 'M')) {
            result -= 100;
        } else {
            switch (currentChar) {
                case 'I':
                    result += 1;
                    break;
                case 'V':
                    result += 5;
                    break;
                case 'X':
                    result += 10;
                    break;
                case 'L':
                    result += 50;
                    break;
                case 'C':
                    result += 100;
                    break;
                case 'D':
                    result += 500;
                    break;
                case 'M':
                    result += 1000;
                    break;
                default:
                    break;
            }
        }
    }

    return result;
}

}

该算法直接根据题目中的规则进行逐个字符判断,并计算最终的整数结果。时间复杂度为O(n),其中n是给定的罗马数字字符串的长度。空间复杂度为O(1)。 

LeetCode运行结果:

方法三:模拟减法

还有一种方法是基于模拟减法的思路来将罗马数字转换成整数。

具体的步骤如下:

  1. 初始化一个变量result为0,表示最终的整数结果。

  2. 遍历给定的罗马数字字符串s,从左往右逐个字符判断:

    • 如果当前字符的值比前一个字符的值大,则需要执行减法操作。将两个字符对应的值进行减法操作,并将结果加到result上。注意,这里要通过减去两倍的前一个字符的值,来抵消之前被加上的值。

    • 否则,直接将当前字符的值加到result上。

  3. 返回result作为最终的整数表示。

class Solution {
public int romanToInt(String s) {
    Map<Character, Integer> romanMap = new HashMap<>();
    romanMap.put('I', 1);
    romanMap.put('V', 5);
    romanMap.put('X', 10);
    romanMap.put('L', 50);
    romanMap.put('C', 100);
    romanMap.put('D', 500);
    romanMap.put('M', 1000);

    int result = 0;
    int prevValue = 0;
    for (int i = 0; i < s.length(); i++) {
        int value = romanMap.get(s.charAt(i));
        if (value > prevValue) {
            result += value - 2 * prevValue;
        } else {
            result += value;
        }
        prevValue = value;
    }

    return result;
}


}

该算法通过模拟减法的操作来计算最终的整数结果。时间复杂度为O(n),其中n是给定的罗马数字字符串的长度。空间复杂度为O(1)。 

LeetCode运行结果:

第二题

题目来源

14. 最长公共前缀 - 力扣(LeetCode)

题目内容

解决方法

方法一:水平扫描法

可以使用水平扫描法来查找字符串数组中的最长公共前缀。

具体的步骤如下:

1、初始化一个空字符串prefix,表示最长公共前缀。

2、如果输入的字符串数组为空或长度为0,则直接返回空字符串。

3、遍历字符串数组中的第一个字符串strs[0]的每个字符:

  • 对于每个字符,遍历字符串数组中的其他字符串strs[i],其中i从1到n-1(n是字符串数组的长度)。
  • 如果当前字符在其他字符串的相同位置上的字符不相等,或者其他字符串的长度小于等于当前位置,则表示不匹配,直接返回当前的公共前缀。
  • 否则,将当前字符添加到prefix中。

4、返回prefix作为最长公共前缀。

class Solution {
    public String longestCommonPrefix(String[] strs) {
    if (strs == null || strs.length == 0) {
        return "";
    }

    String prefix = strs[0];
    for (int i = 1; i < strs.length; i++) {
        while (strs[i].indexOf(prefix) != 0) {
            prefix = prefix.substring(0, prefix.length() - 1);
            if (prefix.isEmpty()) {
                return "";
            }
        }
    }

    return prefix;
}

}

该算法通过逐个字符比较字符串数组中的字符串来查找最长公共前缀。时间复杂度为O(mn),其中m是最长公共前缀的长度,n是字符串数组的长度。空间复杂度为O(1)。 

LeetCode运行结果:

方法二:垂直扫描法

具体的步骤如下:

1、如果输入的字符串数组为空或长度为0,则直接返回空字符串。

2、遍历字符串数组中的每个字符的索引位置idx,从0到字符数组中最短字符串的长度-1:

  • 对于每个索引位置idx,遍历字符串数组中的每个字符串strs[i],其中i从0到n-1(n是字符串数组的长度)。
  • 如果当前索引位置超过了当前字符串的长度,或者当前字符在其他字符串的相同位置上的字符不相等,则表示不匹配,直接返回当前的公共前缀。
  • 否则,将当前字符添加到最长公共前缀的末尾。

3、返回最长公共前缀作为结果。

class Solution {
public String longestCommonPrefix(String[] strs) {
    if (strs == null || strs.length == 0) {
        return "";
    }

    int minLength = getMinLength(strs);
    StringBuilder prefix = new StringBuilder();
    for (int idx = 0; idx < minLength; idx++) {
        char currentChar = strs[0].charAt(idx);
        for (int i = 1; i < strs.length; i++) {
            if (strs[i].charAt(idx) != currentChar) {
                return prefix.toString();
            }
        }
        prefix.append(currentChar);
    }

    return prefix.toString();
}

private int getMinLength(String[] strs) {
    int minLength = Integer.MAX_VALUE;
    for (String str : strs) {
        minLength = Math.min(minLength, str.length());
    }
    return minLength;
}


}

该算法通过逐个字符比较字符串数组中的字符串来查找最长公共前缀。时间复杂度为O(mn),其中m是最短字符串的长度,n是字符串数组的长度。空间复杂度为O(1)。

LeetCode运行结果:

方法三:分治法

具体的步骤如下:

  1. 如果输入的字符串数组为空或长度为0,则直接返回空字符串。
  2. 调用一个辅助函数longestCommonPrefixHelper,传入字符串数组和索引范围[0, n-1](n是字符串数组的长度)。
  3. 在longestCommonPrefixHelper函数中,如果起始索引等于结束索引,则返回当前字符串作为最长公共前缀。
  4. 将索引范围划分为两半,分别调用longestCommonPrefixHelper函数来获取左半部分和右半部分的最长公共前缀。
  5. 对左半部分和右半部分的最长公共前缀进行比较,取两者的最长公共前缀作为结果。
class Solution {
public String longestCommonPrefix(String[] strs) {
    if (strs == null || strs.length == 0) {
        return "";
    }

    return longestCommonPrefixHelper(strs, 0, strs.length - 1);
}

private String longestCommonPrefixHelper(String[] strs, int start, int end) {
    if (start == end) {
        return strs[start];
    }

    int mid = (start + end) / 2;
    String leftPrefix = longestCommonPrefixHelper(strs, start, mid);
    String rightPrefix = longestCommonPrefixHelper(strs, mid + 1, end);

    return commonPrefix(leftPrefix, rightPrefix);
}

private String commonPrefix(String str1, String str2) {
    int length = Math.min(str1.length(), str2.length());
    int i = 0;
    while (i < length && str1.charAt(i) == str2.charAt(i)) {
        i++;
    }
    return str1.substring(0, i);
}

}

该算法使用递归地将字符串数组划分为更小的部分,最终求得最长公共前缀。时间复杂度为O(mnlogn),其中m是字符串的平均长度,n是字符串数组的长度。空间复杂度为O(logn),用于递归调用栈的额外空间。

LeetCode运行结果:

方法四:二分查找

具体的步骤如下:

  1. 如果输入的字符串数组为空或长度为0,则直接返回空字符串。
  2. 将最短的字符串作为起始点,将最长的字符串作为终止点。
  3. 计算起始点和终止点的中点mid。
  4. 判断从起始点到中点的字符串是否都是其他字符串的公共前缀。如果是,则继续在右半部分查找;否则,在左半部分查找。
  5. 重复步骤3和步骤4,直到起始点和终止点相等或者起始点大于终止点。
  6. 返回起始点和终止点相等的字符串作为结果。
class Solution {
public String longestCommonPrefix(String[] strs) {
    if (strs == null || strs.length == 0) {
        return "";
    }

    int minLength = getMinLength(strs);
    int start = 0, end = minLength - 1;
    while (start <= end) {
        int mid = (start + end) / 2;
        if (isCommonPrefix(strs, mid)) {
            start = mid + 1;
        } else {
            end = mid - 1;
        }
    }

    return strs[0].substring(0, (start + end + 1) / 2);
}

private int getMinLength(String[] strs) {
    int minLength = Integer.MAX_VALUE;
    for (String str : strs) {
        minLength = Math.min(minLength, str.length());
    }
    return minLength;
}

private boolean isCommonPrefix(String[] strs, int idx) {
    String prefix = strs[0].substring(0, idx + 1);
    for (int i = 1; i < strs.length; i++) {
        if (!strs[i].startsWith(prefix)) {
            return false;
        }
    }
    return true;
}

}

该算法使用二分查找来逐步缩小最长公共前缀的范围,时间复杂度为O(mnlogm),其中m是最短字符串的长度,n是字符串数组的长度。空间复杂度为O(1)。

LeetCode运行结果:

第三题

题目来源

15. 三数之和 - 力扣(LeetCode)

题目内容

解决方法

方法一:双指针

可以使用双指针的方法来解决这个问题。首先,对数组进行排序,然后使用两个指针i和j来遍历数组。

具体的步骤如下:

  1. 对数组进行排序,确保数组是有序的。
  2. 遍历数组,对于每个元素nums[i],设置两个指针left和right分别指向i之后的开始和结束位置。
  3. 在left和right之间使用双指针法,寻找满足nums[i]+nums[left]+nums[right]==0的三元组。
  4. 如果找到满足条件的三元组,将其加入结果集。
  5. 跳过重复的元素,即如果nums[i]和nums[i-1]相等,则跳过当前循环。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
    List<List<Integer>> result = new ArrayList<>();
    if (nums == null || nums.length < 3) {
        return result;
    }

    Arrays.sort(nums); // 排序数组

    for (int i = 0; i < nums.length - 2; i++) {
        if (i > 0 && nums[i] == nums[i - 1]) {
            continue; // 跳过重复的元素
        }

        int target = -nums[i];
        int left = i + 1, right = nums.length - 1;

        while (left < right) {
            int sum = nums[left] + nums[right];
            if (sum == target) {
                result.add(Arrays.asList(nums[i], nums[left], nums[right]));
                left++;
                right--;

                // 跳过重复的元素
                while (left < right && nums[left] == nums[left - 1]) {
                    left++;
                }
                while (left < right && nums[right] == nums[right + 1]) {
                    right--;
                }
            } else if (sum < target) {
                left++;
            } else {
                right--;
            }
        }
    }

    return result;
}
}

该算法的时间复杂度为O(n^2),其中n是数组的长度。排序的时间复杂度为O(nlogn),双指针的遍历时间复杂度为O(n^2)。空间复杂度为O(logn)或O(n),取决于排序算法的实现。最终返回的结果列表所占用的空间不计入空间复杂度。 

LeetCode运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1032235.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023-09-22 LeetCode每日一题(将钱分给最多的儿童)

2023-09-22每日一题 一、题目编号 2591. 将钱分给最多的儿童二、题目链接 点击跳转到题目位置 三、题目描述 给你一个整数 money &#xff0c;表示你总共有的钱数&#xff08;单位为美元&#xff09;和另一个整数 children &#xff0c;表示你要将钱分配给多少个儿童。 你…

华为OD机试 - 事件推送(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、Java算法源码五、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》。 刷的越多…

联合作战模式下的信息过滤方法

源自&#xff1a;《指挥信息系统与技术》 作者&#xff1a;马雷鸣&#xff0c;张道伟 “人工智能技术与咨询” 发布 摘要 引言 1 相关工作 2 基于虚词的信息过滤方法 图1 本文方法流程 2.1 云-边-端架构 图2 云-边-端架构 2.2 作战信息特征提取 图3 常用虚词表 2.3 …

数字藏品系统平台怎么样挣钱?

数字藏品系统平台是为用户提供数字艺术品、收藏品、虚拟物品等数字化资产的交易和管理服务的平台。这类平台通常有以下方式来挣钱&#xff1a; 1.手续费&#xff1a;平台可以在用户之间进行数字藏品的买卖交易时收取手续费。这通常是基于交易金额的一定比例或固定费用。这是数字…

华为全联接大会2023 | 尚宇亮:携手启动O3社区发布

2023年9月20日&#xff0c;在华为全联接大会2023上&#xff0c;华为正式发布“联接全球服务工程师&#xff0c;聚合用户服务经验”的知识经验平台&#xff0c;以“Online 在线、Open 开放、Orchestration 协同”为理念&#xff0c;由华为、伙伴和客户携手&#xff0c;共同构建知…

Mysql 按照每小时,每天,每月,每年,不存在数据也显示

文章目录 按照每小时按照每天按照每月 按照每小时 SELECTdate : date_add( date, INTERVAL 1 HOUR ) AS DAY FROM( SELECT date : DATE_ADD( 2023-09-22, INTERVAL - 1 HOUR ) FROM xt_user LIMIT 24 ) t按照每天 SELECTdate : date_add( date, INTERVAL 1 day ) AS DAY FRO…

量子计算基础知识—Part1

1.什么是量子计算机&#xff1f; 量子计算机是基于量子力学原理构建的机器&#xff0c;采用了一种新的方法来处理信息&#xff0c;从而使其具有超强的功能。量子计算机使用Qubits处理信息。 2. 什么是量子系统&#xff1f; 一个量子系统指的是由量子力学规则描述和控制的物理…

计算机视觉与深度学习-卷积神经网络-卷积图像去噪边缘提取-图像去噪 [北邮鲁鹏]

目录标题 参考学习链接图像噪声噪声分类椒盐噪声脉冲噪声对椒盐噪声&脉冲噪声去噪使用高斯卷积核中值滤波器 高斯噪声减少高斯噪声 参考学习链接 计算机视觉与深度学习-04-图像去噪&卷积-北邮鲁鹏老师课程笔记 图像噪声 噪声点&#xff0c;其实在视觉上看上去让人感…

2023-9-22 滑雪

题目链接&#xff1a;滑雪 #include <cstring> #include <algorithm> #include <iostream>using namespace std;const int N 310;int n, m; int h[N][N]; int f[N][N];int dx[4] {-1, 0, 1, 0}, dy[4] {0, 1, 0, -1};int dp(int x, int y) {int &v f…

启山智软/一款包含主流商城类型的一款电商中台系统100%开源

文章目录 介绍一、Smart Shop JAVA 微服务电商中台优势二、电商中台包含那些主流商城模式1.S2B2C供应链商城2.B2B2C多商户商城3.B2C单商户商城4.O2O外卖配送商城5.社区团购商城 6.演示地址总结 介绍 想要了解代码规范&#xff0c;学习商城解决方案&#xff0c;点击下方官网链接…

acwing算法基础-chapter01-差分

差分介绍 结论&#xff1a;差分是前缀和的逆运算 举例 一维差分 //一维前缀和 a[i]部分就是一维差分数组 s[i] s[i-1]a[i]; //一维差分 a[i] s[i]-s[i-1];二维差分 //二维前缀和 a[i][j]部分就是一维差分数组 s[i][j] s[i-1][j]s[i][j-1]-s[i-1][j-1]a[i][j]; //二维差分…

Cordova插件开发:集成南方测绘RTK实现高精度卫星定位

文章目录 1.最终效果预览2.页面持续展示获取的坐标3.公共类utilsTools中封装得获取坐标方法4.南方测绘坐标获取封装5.插件js方法封装6.Java方法封装1.最终效果预览 说明:南方测绘RTK设备厂家提供的SDK中封装了蓝牙搜索连接、Cross账号登录等功能,我们通过Cordova插件进一步封…

Python150题day09

③多条件分支 使用input函数接收用户的输入数据&#xff0c;如果用户输入python&#xff0c;则输出90&#xff0c;如果用户输入java.输出95&#xff0c;如果用户输入php&#xff0c;输出85&#xff0c;其他输入&#xff0c;程序输出0 解答&#xff1a; if...elif...else val…

centos 上安装 kafka 与 python 调用

step0: 环境准备 1、 安装jdk 1.8 以上版本 yum -y install java-1.8.0-openjdk.x86_642、 安装配置ZooKeeper wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.2/apache-zookeeper-3.8.2-bin.tar.gz --no-check-certificate tar -zxf apache-zookeeper-3.8.2-bin.t…

首购2元起!CDN与加速特惠专场来啦~

还在为内容分发、加速成本发愁吗&#xff1f;看过来&#xff01;火山引擎边缘云CDN与加速特惠专场来啦&#xff01; 限时活动&#xff1a;首购2元起&#xff0c;新老低至7折&#xff01; 限时优惠&#xff01;错过后悔&#xff01;这波折扣实实在在&#xff01; 首购专区 新…

用户体验测试:确保产品满足用户期望的关键步骤

在当今竞争激烈的市场中&#xff0c;为了确保产品的成功和用户的满意度&#xff0c;用户体验测试变得至关重要。通过系统化地评估产品在用户使用过程中的可用性、便利性和满意度&#xff0c;用户体验测试有助于发现潜在问题并改进产品设计。本文将介绍用户体验测试的关键步骤和…

有什么推荐使用的企业上网行为管理软件?

在当今信息化社会&#xff0c;企业的上网行为管理越来越重要。企业上网行为软件是一种能够监控和管理企业员工上网行为的工具&#xff0c;它可以帮助企业更好地管理网络资源&#xff0c;提高工作效率&#xff0c;保护企业信息安全&#xff0c;并符合相关的法律法规。本文将深入…

【煤矿虚拟仿真体验】VR采煤机技能培训有效提高训练效果

在我们的社会中&#xff0c;能源是至关重要的。它是推动我们日常生活和工作的主要动力。然而&#xff0c;我们在获取这种能源的过程中&#xff0c;也带来了许多环境问题。煤矿开采是其中的一个重要部分&#xff0c;因此我们需要寻找更环保、更安全的方式来进行煤矿开采。VR&…

【开发篇】三、web下单元测试与mock数据

文章目录 1、加载测试专用属性2、加载测试专用配置3、测试类中启动web环境4、发送虚拟请求5、匹配&#xff08;断言&#xff09;响应的执行状态6、匹配响应的结果7、匹配响应头8、业务层测试事务回滚9、UT数据设置随机数据 1、加载测试专用属性 写单元测试时&#xff0c;如果需…

PyTorch实战:卷积神经网络详解+Python实现卷积神经网络Cifar10彩色图片分类

目录 前言 一、卷积神经网络概述 二、卷积神经网络特点 卷积运算 单通道&#xff0c;二维卷积运算示例 单通道&#xff0c;二维&#xff0c;带偏置的卷积示例 带填充的单通道&#xff0c;二维卷积运算示例 Valid卷积 Same卷积 多通道卷积计算 1.局部感知域 2.参数共…