DAY3-力扣刷题

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遍历的

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C/C++:指针用法详解

C/C&#xff1a;指针 指针概念 指针变量也是一个变量 指针存放的内容是一个地址&#xff0c;该地址指向一块内存空间 指针是一种数据类型 指针变量定义 内存最小单位&#xff1a;BYTE字节&#xff08;比特&#xff09; 对于内存&#xff0c;每个BYTE都有一个唯一不同的编号…

微软OneDrive简介:特点、应用场景、使用方法、注意事项

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 6月16日,星期日

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年6月16日 星期日 农历五月十一 1、 国家网信办&#xff1a;将涉网络暴力违法情形记入用户信用记录。 2、 卫健委&#xff1a;超三成3岁以下婴幼儿家庭有入托需求&#xff0c;托育服务关注度持续上升。 3、 大陆对台134项关…

Keysight 是德 N9343C 手持式频谱分析仪

Keysight 是德 N9343C 手持式频谱分析仪 主要特性与技术指标 功能 • 1 MHz &#xff5e; 13.6 GHz&#xff08;可调谐至 9 kHz&#xff09; • 内部前置放大器高达 13.6 GHz • 内置 GPS 接收机和 GPS 天线 • 内置跟踪发生器 性能 • -144 dBm 典型的显示平均噪声电平&a…

竟然与 package-lock.json 更新有关!部分用户 H5 页面白屏问题!

一.问题 1 场景 现象 接到部分用户反馈进入xxx H5 页面空白&#xff1b; 研发测日志里问题用户的线上页面URL地址可以正常访问&#xff0c;没有复现问题&#xff01;&#xff01;&#xff01; 定位问题 监控平台和客户端日志报错&#xff1a; SyntaxError: Unexpected toke…

LabVIEW与Matlab联合编程的途径及比较

​ LabVIEW和Matlab联合编程可以通过多种途径实现&#xff0c;包括调用Matlab脚本节点、使用LabVIEW MathScript RT模块、利用ActiveX和COM接口&#xff0c;以及通过文件读写实现数据交换。每种方法都有其独特的优势和适用场景。本文将详细比较这些方法&#xff0c;帮助开发者…

Jupyter Notebook简介

目录 1.概述 2.诞生背景 3.历史版本 4.安装 5.卸载 6.如何使用 7.菜单和菜单项 8.示例 9.未来展望 10.总结 1.概述 Jupyter Notebook是一种基于Web的交互式计算环境&#xff0c;主要用于数据分析、数据科学、机器学习以及探索性编程等领域。允许用户在单个文档中编写…

基于ASRPRO智能离线语音识别模块实现人机交流对话应用

基于ASRPRO智能离线语音识别模块实现人机交流对话应用 ASRPRO智能离线语音识别模块简介ASRPRO智能离线语音识别模块功能介绍ASRPRO智能离线语音识别模块电路说明ASRPRO智能离线语音识别模块应用案例ASRPRO智能离线语音识别模块管脚说明ASRPRO芯片管脚分布图ASRPRO语音识别模块系…

基于CentOS Stream 9平台安装Redis7.0.15

已更正systemctl管理Redis服务问题 1. 官方下载地址 https://redis.io/downloads/#redis-downloads 1.1 下载或上传到/opt/coisini目录下&#xff1a; mkdir /opt/coisini cd /opt/coisini wget https://download.redis.io/releases/redis-7.0.15.tar.gz2. 解压 tar -zxvf re…

Bug:SSH Failed Permission Denied(完美解决)

Bug&#xff1a;SSH Failed Permission Denied&#xff08;完美解决&#xff09; 今天我本机mac通过ssh访问linux服务器时报错&#xff1a;SSH Failed Permission Denied 思路&#xff1a; linux服务器sshd是否开启linux /etc/ssh/sshd_config配置是否正确&#xff08;是否开启…

springboot集成shardingsphere-分库分表

导入maven依赖&#xff0c;如下 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><a…

【MYSQL】MYSQL操作库

1.数据库字符编码集/数据库校验集 当我们在数据库中保存数据时&#xff0c;需要存和取时候编码一致&#xff0c;比方说你用汉语保存的数据&#xff0c;当你读的时候为了避免乱码问题&#xff0c;也必须用汉语读&#xff0c;这就叫做数据库字符编码集一致。 当我们进行查找&…

代码随想录算法训练营刷题复习1 :动态规划背包问题 01背包+完全背包

动态规划刷题复习 一、01背包 416. 分割等和子集1049. 最后一块石头的重量 II494. 目标和474. 一和零 416. 分割等和子集 class Solution { public:bool canPartition(vector<int>& nums) {int sum0;for(int i0;i<nums.size();i) {sumnums[i];}if(sum%2!0)retu…

Python高级编程:Functools模块的8个高级用法,强烈建议添加到你的开发工具箱中!

目录 1. functools.partial 2. functools.lru_cache lru_cache的特点 cache的特点 性能比较与选择 3. functools.reduce functools.reduce的作用 工作原理 示例 累加序列中的所有元素 计算阶乘 initializer的使用 应用场景 示例:计算平均销售额 小结 4. funct…

不可不知的Java SE技巧:如何使用for each循环遍历数组

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

【面试题】MySQL常见面试题总结

备战实习&#xff0c;会定期给大家整理常考的面试题&#xff0c;大家一起加油&#xff01; &#x1f3af; 系列文章目录 【面试题】面试题分享之JVM篇【面试题】面试题分享之Java并发篇【面试题】面试题分享之Java集合篇&#xff08;三&#xff09; 注意&#xff1a;文章若有错…

StarNet实战:使用StarNet实现图像分类任务(一)

文章目录 摘要安装包安装timm 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集 摘要 https://arxiv.org/pdf/2403.19967 论文主要集中在介绍和分析一种新兴的学习范式——星操作&#xff08;Star Operation&#xff09;&#xff0c;这是一种通过元素级乘法融合不同子…

[大模型]XVERSE-7B-chat langchain 接入

XVERSE-7B-Chat为XVERSE-7B模型对齐后的版本。 XVERSE-7B 是由深圳元象科技自主研发的支持多语言的大语言模型&#xff08;Large Language Model&#xff09;&#xff0c;参数规模为 70 亿&#xff0c;主要特点如下&#xff1a; 模型结构&#xff1a;XVERSE-7B 使用主流 Deco…

echarts学习:通过图例事件实现选中后控制多条折线的显隐

1.问题描述 我在工作中遇到了这样一个需求&#xff1a;我们都知道点击echarts折线图的图例&#xff0c;是可以控制折线的显隐的。我现在希望点击某一个图例可以改变多条折线的显隐。 例如在下面这张图中&#xff0c;我将“xxx水位”和“yyy水位”分为一组&#xff1b;将“xxx…

521. 最长特殊序列 Ⅰ(Rust单百解法-脑筋急转弯)

题目 给你两个字符串 a 和 b&#xff0c;请返回 这两个字符串中 最长的特殊序列 的长度。如果不存在&#xff0c;则返回 -1 。 「最长特殊序列」 定义如下&#xff1a;该序列为 某字符串独有的最长 子序列 &#xff08;即不能是其他字符串的子序列&#xff09; 。 字符串 s …