DAY3-力扣刷题

news2024/11/26 18:42:18

1.罗马数字转整数

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

罗马数字包含以下七种字符: I, V, X, LCD 和 M

字符          数值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

  • I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
  • X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 
  • C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

给定一个罗马数字,将其转换成整数。

//这个题需要找规律

class Solution {
    public static int romanToInt(String s) {
        HashMap<Character,Integer> hashMap=new HashMap<>();
        hashMap.put('I',1);
        hashMap.put('V',5);
        hashMap.put('X',10);
        hashMap.put('L',50);
        hashMap.put('C',100);
        hashMap.put('D',500);
        hashMap.put('M',1000);
        Integer length=s.length();
        Integer sum=0;
        for (int i=0;i<s.length();i++){
            char ch=s.charAt(i);
            int value=hashMap.get(ch);
            if(i<length-1&&value<hashMap.get(s.charAt(i+1))){
                sum=sum-value;
            }else {
                sum=sum+value;
            }
            //特殊情况
            //IV:4 IX:9
            //XL:40 XC:90
            //CD:400 CM:900

        }
        return sum;
    }

}

 找规律看清楚题目很重要

2.最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""

示例 1:

输入:strs = ["flower","flow","flight"]
输出:"fl"

示例 2:

输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。

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

class Solution2 {
    public static String longestCommonPrefix(String[] strs) {
        if(strs==null||strs.length==0){
            return "";
        }
        int length=strs.length;
        for(int i=0;i<strs[0].length();i++){//第一个字符串的截止范围
            char ch=strs[0].charAt(i);//字符串的第一个字母
            for(int j=1;j<length;j++){//和每一个字符串是否匹配
                if(i==strs[j].length()||strs[j].charAt(i)!=ch){
                    //弹出的条件
                    return strs[0].substring(0,i);
                }
            }
        }
        return strs[0];
    }
}

3.三数之和

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

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

下题解有重复的结果 

class Solution3 {
    public static List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> list=new ArrayList<>();
        int length=nums.length;
        for(int i=0;i<length-2;i++){
            for(int j=i+1;j<length-1;j++){
                for(int z=j+1;z<length;z++){
                    int sum=nums[i]+nums[j]+nums[z];
                    if(sum==0){
                        List<Integer> ls=new ArrayList<>();
                        ls.add(nums[i]);
                        ls.add(nums[j]);
                        ls.add(nums[z]);
                        list.add(ls);
                    }
                }
            }
        }
        return list;
    }
}

 方法一:排序 + 双指针

class Solution {
    public static List<List<Integer>> threeSum(int[] nums) {
        int n=nums.length;
        //把数组从大到小进行排序
        Arrays.sort(nums);
        List<List<Integer>> ans = new ArrayList<List<Integer>>();
        //枚举a,b,c
        //其实就是三层循环
        //枚举abc
        //不能出现bac
        //所以需要将数组从大到小进行排序
        //同时已经有了abc,再出现a需要跳出循环
        for(int first=0;first<n;first++){
            //需要和上一次的枚举有所不同
            if(first>0&&nums[first]==nums[first-1]){
                continue;//跳出循环
            }
            //a是一层循环
            //bc左右双指针进行遍历
            //c对应的指针初始指向数组的最右端
            int third=n-1;
            int target=-nums[first];//b,c之和需要是target
            for(int second=first+1;second<n;second++){
                //同样需要和上一次枚举的数有所不同
                if(second>first+1&&nums[second]==nums[second-1]){
                    continue;
                }
                //需要保证b的指针在c的指针的左侧
                while(second<third&&nums[second]+nums[third]>target){
                    --third;
                }
                // 如果指针重合,随着 b 后续的增加
                // 就不会有满足 a+b+c=0 并且 b<c 的 c 了,可以退出循环
                if (second == third) {
                    break;//跳出本层循环
                }
                if (nums[second] + nums[third] == target) {
                    List<Integer> list = new ArrayList<Integer>();
                    list.add(nums[first]);
                    list.add(nums[second]);
                    list.add(nums[third]);
                    ans.add(list);
                }
            }
        }
        return ans;
    }
    
}

4.最接近的三数之和 

16. 最接近的三数之和 - 力扣(LeetCode)

学会使用while循环

给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。

返回这三个数的和。

假定每组输入只存在恰好一个解。

超出时间限制

class Solution {
    public static int threeSumClosest(int[] nums, int target) {
        int sumsave = Integer.MAX_VALUE;
        int absave = Integer.MAX_VALUE;
        // 同样是将数组进行排序
        // 排序是从小到大进行排序的
        Arrays.sort(nums);
        // 1.如果第一层有一个数组大于target,它的下一个我们便结束遍历
        for (int first = 0; first < nums.length; first++) {
            // 跳出第一层循环的时刻
            // 同时不用a,b,c中的a是相同的
            if (first > 0 && nums[first] == nums[first - 1]) {
                continue;// 跳出本层循环
            }
            if (first > 1 && nums[first - 1] > target) {
                break;// 直接跳出整个循环
            }
            int third = nums.length - 1;
            int second = first + 1;
            // 同样是左右指针
            for (second = first + 1; second < nums.length; second++) {
                if (second > first + 1 && nums[second] == nums[second - 1]) {
                    continue;// 跳出本层循环
                }
                if (second > first + 1 && nums[second - 1] > target) {
                    break;// 直接跳出整个循环
                }
                while (second < third) {
                    int sum = nums[third] + nums[second] + nums[first];
                    int abs = Math.abs(sum - target);
                    // abs需要最小的时刻
                    if (abs==0) {
                        return sum;
                    } else if (abs < absave) {
                        sumsave = sum;
                        absave = abs;
                        third--;
                    } 

                }
            }
        }
        return sumsave;

    }
}
class Solution {
    public static int threeSumClosest(int[] nums, int target) {
        int sumsave = Integer.MAX_VALUE;
        int absave = Integer.MAX_VALUE;
        // 同样是将数组进行排序
        // 排序是从小到大进行排序的
        Arrays.sort(nums);
        // 1.如果第一层有一个数组大于target,它的下一个我们便结束遍历
        for (int first = 0; first < nums.length; first++) {
            // 跳出第一层循环的时刻
            // 同时不用a,b,c中的a是相同的
            if (first > 0 && nums[first] == nums[first - 1]) {
                continue;// 跳出本层循环
            }
            if (first > 1 && nums[first - 1] > target) {
                break;// 直接跳出整个循环
            }
            int third = nums.length - 1;
            int second = first + 1;
            /*// 同样是左右指针
            for (second = first + 1; second < nums.length; second++) {
                if (second > first + 1 && nums[second] == nums[second - 1]) {
                    continue;// 跳出本层循环
                }
                if (second > first + 1 && nums[second - 1] > target) {
                    break;// 直接跳出整个循环
                }
                while (second < third) {
                    int sum = nums[third] + nums[second] + nums[first];
                    int abs = Math.abs(sum - target);
                    // abs需要最小的时刻
                    if (abs == absave) {
                        return sumsave;
                    } else if (abs < absave) {
                        sumsave = sum;
                        absave = abs;
                        third--;
                    } else {
                        break;
                    }

                }
            }*/
            //左右指针
            while (second<third){
                //如果target大了右指针向左
                //如果target小了做指针向右
                int sum = nums[third] + nums[second] + nums[first];

                int abs = Math.abs(sum - target);
                // abs需要最小的时刻
                if (sum==target) {
                    sumsave=sum;
                    return sumsave;
                }else if(sum<target){
                    if(absave>abs){
                        absave=abs;
                        sumsave=sum;
                    }
                    second++;
                }else if(sum>target){
                    if(absave>abs){
                        absave=abs;
                        sumsave=sum;
                    }
                    third--;
                }
            }
        }
        return sumsave;

    }
}

5.电话号码和字母组合(有问题)

17. 电话号码的字母组合 - 力扣(LeetCode)

//实现递归

class Solution {
    public List<String> letterCombinations(String digits) {
        List<String> combinations = new ArrayList<String>();
        if (digits.length() == 0) {
            return combinations;
        }
        Map<Character, String> phoneMap = new HashMap<Character, String>() {{
            put('2', "abc");
            put('3', "def");
            put('4', "ghi");
            put('5', "jkl");
            put('6', "mno");
            put('7', "pqrs");
            put('8', "tuv");
            put('9', "wxyz");
        }};
        backtrack(combinations, phoneMap, digits, 0, new StringBuffer());
        return combinations;
    }

    public void backtrack(List<String> combinations, Map<Character, String> phoneMap, String digits, int index, StringBuffer combination) {
        if (index == digits.length()) {
            combinations.add(combination.toString());
        } else {
            char digit = digits.charAt(index);
            String letters = phoneMap.get(digit);
            int lettersCount = letters.length();
            for (int i = 0; i < lettersCount; i++) {
                combination.append(letters.charAt(i));
                backtrack(combinations, phoneMap, digits, index + 1, combination);
                combination.deleteCharAt(index);
            }
        }
    }
}

//不加入该语句时

//combination.deleteCharAt(index);

//递归过程
//先经历了一层循环,即就是每个字母字符串的大小
//1.
//a
//d
//然后将字符串加入list中
//一层遍历结束后,需要删除第digit遍历的

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

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

相关文章

MySQL常见的命令

MySQL常见的命令 查看数据库&#xff08;注意添加分号&#xff09; show databases;进入到某个库 use 库; 例如&#xff1a;进入test use test;显示表格 show tables;直接展示某个库里面的表 show tables from 库&#xff1b; 例如&#xff1a;展示mysql中的表格 show tabl…

无广告、简单、实用的高性能 PDF 处理工具

一、简介 1、无广告、简单、实用的高性能 PDF 处理工具。它安装包大小在 240MB 左右&#xff0c;目前仅支持 Windows 平台。 二、下载 1、文末有下载链接,不明白可以私聊我哈&#xff08;麻烦咚咚咚&#xff0c;动动小手给个关注收藏小三连&#xff0c;我将继续努力为大家寻找以…

【Linux】进程_8

文章目录 五、进程10. 进程等待阻塞等待和非阻塞等待 11. 进程程序替换 未完待续 五、进程 10. 进程等待 上一篇我们知道了 wait 和 waitpid 函数都有一个 status 参数&#xff0c;这个参数是什么呢&#xff1f;这个参数其实就是进程的返回结果&#xff0c;当子进程结束的时候…

银行数仓项目实战(一)--什么是数据仓库

文章目录 数据仓库特点目的&#xff1a;监管报送监管报送的系统主要有&#xff1f;监管报送报送的数据 OLTP和OLAP 架构 数据仓库 数据仓库是一个面向主题的&#xff0c;集成的&#xff0c;非易失的且随时间变化的数据集合&#xff0c;用来支持管理人员的决策。 数据仓库是一个…

Nuxt快速学习开发 - Nuxt3静态资源Assets

Nuxt 使用两个目录来处理样式表、字体或图像等资产。 public/目录内容按原样在服务器根目录中提供。 assets/目录包含您希望构建工具&#xff08;Vite 或 webpack&#xff09;处理的所有资产。 public/目录 public目录用作静态资产的公共服务器&#xff0c;可在您的应用程序定…

CEM美国培安消解罐内管 CEM40位 55ML 微波消解罐

内罐采用高纯实验级进口增强改性处理TFM材料或PFA材料&#xff0c;我厂加工的微波罐能与原厂仪器匹配&#xff0c;而且是盖、体通配&#xff0c;无尺寸误差。精选材质&#xff0c;未添加回料&#xff0c;洁净的加工环境&#xff0c;优化了加工工艺&#xff0c;确保低本底&#…

Java多线程设计模式之不可变对象(Immutable Object)模式

简介 多线程共享变量的情况下&#xff0c;为了保证数据一致性&#xff0c;往往需要对这些变量的访问进行加锁。而锁本身又会带来一些问题和开销。Immutable Object模式使得我们可以在不加锁的情况下&#xff0c;既保证共享变量访问的线程安全&#xff0c;又能避免引入锁可能带…

图书管理系统代码(Java)

1、运行演示 QQ2024528-205028-HD 详细讲解在这篇博客&#xff1a;JavaSE&#xff1a;图书管理系统-CSDN博客 2、所建的包 3、Java代码 3.1 book包 3.1.1 Book类代码 package book;/*** Created with IntelliJ IDEA.* Description:* User: dings* Date: 2024-05-13* Time:…

CentOS 7.9检测硬盘坏区、实物定位(三)

系列文章目录 CentOS 7.9上创建JBOD&#xff08;一&#xff09; CentOS 7.9上创建的JBOD阵列恢复&#xff08;二&#xff09; 文章目录 系列文章目录前言一、在系统中找到硬盘对应的盘符二、使用命令定位实物1.badblocks检测坏块2.对2T以上的硬盘检测&#xff08;对本篇非必要…

【Mongodb-01】Mongodb亿级数据性能测试和压测

mongodb数据性能测试 一&#xff0c;mongodb数据性能测试1&#xff0c;mongodb数据库创建和索引设置2&#xff0c;线程池批量方式插入数据3&#xff0c;一千万数据性能测试4&#xff0c;两千万数据性能测试5&#xff0c;五千万数据性能测试6&#xff0c;一亿条数据性能测试7&am…

力扣每日一题 6/17 枚举+双指针

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 522.最长特殊序列II【中等】 题目&#xff1a; 给定字符串列表 strs &…

.Net OpenCVSharp生成灰度图和二值图

文章目录 前言一、灰度图二、二值图 前言 使用OpenCVSharp生成图片的灰度图和二值图 .Net 8.0版本&#xff0c;依赖OpenCvSharp4和OpenCvSharp4.runtime.win组件。 原图&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、灰度图 /// &…

亚马逊跟卖ERP系统,怎样提升新手卖家选品的质量与效率!

今天给新手卖家推荐一款实用ERP系统&#xff0c;相信新手卖家在碰到最难的问题应该就是选品了吧&#xff0c;那我们该如何快速解决我们找品难找品慢的问题呢&#xff0c;现在有一套专门为跟卖打造的一款全功能erp系统&#xff0c;从我们选品上传&#xff0c;到我们采购&#xf…

针对微电网中可时移,柔性,基础负荷的电价响应模型---代码解析

前言&#xff1a; 在上两篇帖子中&#xff0c;讲解了我对于粒子群算法的理解&#xff0c;站在巨人的肩膀上去回望&#xff1a;科研前辈们确实非常牛逼&#xff0c;所以它才成为了非常经典的算法。这篇帖子主要是想分享一下&#xff0c;对于微电网、电力系统的论文中&#xff0c…

JavaScript事件类型和事件处理程序

● 之前我们用过了很多此的点击事件&#xff0c;这次让我们来学习另一种事件类型 mouseenter “mouseenter” 是一个鼠标事件类型&#xff0c;它在鼠标指针进入指定元素时触发。 const h1 document.querySelector(h1); h1.addEventListener(mouseenter, function (e) {aler…

用Python pillow 创建和保存GIF动画

使用pillow库来创建和保存gif GIFs:图形交换格式(gif)是一种位图图像格式&#xff0c;由美国计算机科学家Steve Wilhite于1987年6月15日领导的在线服务提供商CompuServe的一个团队开发。 一个GIF文件通常存储一个图像&#xff0c;但该格式允许在一个文件中存储多个图像。该格…

用Vue3和p5.js打造一个交互式数据可视化仪表盘

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 基于 Vue.js 集成 p5.js 实现交互式波形图 应用场景介绍 在数据可视化领域&#xff0c;波形图广泛应用于展示动态变化的数据&#xff0c;如声音信号、心跳曲线等。通过动态绘制波形图&#xff0c;用户可以直观…

25天录用!快到飞起的宝藏SSCI,免版面费,1天见刊!毕业评职即刻拿下

本周投稿推荐 SSCI • 中科院2区&#xff0c;6.0-7.0&#xff08;录用友好&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09; CNKI • 7天录用-检索&#xff08;急录友好&#xff09; SCI&EI • 4区生物医学类&#xff0c;0.5-1.0&#xff08;录用…

关于禁止word的无用插入模式

这是我的word版本号 点击左上角文件选项 找到左侧最下方的选项 点击高级 把这两个叉掉

✅生产问题之Emoji表情如何操作存储,MySQL是否支持

针对 Emoji 表情 MySQL 存储是否支持的问题&#xff0c;结论是&#xff1a; MySQL 中可以存储 emoji 表情&#xff0c;但需要使用 UTF8MB4 字符编码。如果使用 UTF8MB3&#xff0c;存储这些扩展字符会导致解析错误。 课外补充 MySQL 对 Unicode 的支持 Unicode 字符集已成为…