当前位置: 首页 > news >正文

【LeetCode 随笔】面试经典 150 题【中等+困难】持续更新中。。。

文章目录

    • 12.【中等】整数转罗马数字
    • 151.【中等】反转字符串中的单词
    • 6.【中等】Z 字形变换
    • 68.【困难】文本左右对齐
    • 167.【中等】两数之和 II - 输入有序数组

🌈你好呀!我是 山顶风景独好
💝欢迎来到我的博客,很高兴能够在这里和您见面!
💝希望您在这里可以感受到一份轻松愉快的氛围!
💝不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
🚀 欢迎一起踏上探险之旅,挖掘无限可能,共同成长!

12.【中等】整数转罗马数字

七个不同的符号代表罗马数字,其值如下:

罗马符号数值
I1
V5
X10
L50
C100
D500
M1000
组合符号数值示例
IV41 (I) 减去 1 (V) 的值
IX91 (I) 减去 10 (X) 的值
XL4010 (X) 减去 1 (L) 的值
XC9010 (X) 减去 100 © 的值
CD400100 © 减去 1 (D) 的值
CM900100 © 减去 1000 (M) 的值

罗马数字是通过添加从最高到最低的小数位值的转换而形成的。将小数位值转换为罗马数字有以下规则:

  • 如果该值不是以 4 或 9 开头,请选择可以从输入中减去的最大值的符号,将该符号附加到结果,减去其值,然后将其余部分转换为罗马数字。
  • 如果该值以 4 或 9 开头,使用 减法形式,表示从以下符号中减去一个符号,例如 4 是 5 (V) 减 1 (I): IV ,9 是 10 (X) 减 1 (I):IX。仅使用以下减法形式:4 (IV),9 (IX),40 (XL),90 (XC),400 (CD) 和 900 (CM)。
  • 只有 10 的次方(I, X, C, M)最多可以连续附加 3 次以代表 10 的倍数。你不能多次附加 5 (V),50 (L) 或 500 (D)。如果需要将符号附加4次,请使用 减法形式。

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

示例 1:

  • 输入:num = 3749
  • 输出: “MMMDCCXLIX”
  • 解释:
    3000 = MMM 由于 1000 (M) + 1000 (M) + 1000 (M)
    700 = DCC 由于 500 (D) + 100 © + 100 ©
    40 = XL 由于 50 (L) 减 10 (X)
    9 = IX 由于 10 (X) 减 1 (I)
    注意:49 不是 50 (L) 减 1 (I) 因为转换是基于小数位

示例 2:

  • 输入:num = 58
  • 输出:“LVIII”
  • 解释:
    50 = L
    8 = VIII
class Solution {  // 定义罗马数字中每个符号对应的整数值  int[] values = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};  // 定义罗马数字符号  String[] symbols = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};  // 将整数转换为罗马数字的方法  public String intToRoman(int num) {   StringBuffer roman = new StringBuffer();  // 遍历每个罗马数字符号和对应的整数值  for (int i = 0; i < values.length; ++i) {  int value = values[i];  String symbol = symbols[i];  // 当整数值大于等于当前罗马数字符号对应的整数值时  while (num >= value) {  // 减去该罗马数字符号对应的整数值  num -= value;  // 在字符串中添加对应的罗马数字符号  roman.append(symbol);  }  // 如果整数已经为0,则提前退出循环  if (num == 0) {  break;  }  }  // 返回构建的罗马数字字符串  return roman.toString();  }  
}

151.【中等】反转字符串中的单词

  • 给你一个字符串 s ,请你反转字符串中 单词 的顺序。
  • 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
  • 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
  • 注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

示例 2:

  • 输入:s = " hello world "
  • 输出:“world hello”
  • 解释:反转后的字符串中不能存在前导空格和尾随空格。

示例 3:

  • 输入:s = “a good example”
  • 输出:“example good a”
  • 解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。

解题思路:

  • 倒序遍历字符串 sss ,记录单词左右索引边界 iii , jjj 。
  • 每确定一个单词的边界,则将其添加至单词列表 resresres 。
  • 最终,将单词列表拼接为字符串,并返回即可。
class Solution {  public String reverseWords(String s) {  // 删除字符串s的首尾空格  s = s.trim();  // 初始化j为字符串s的最后一个字符的索引,i也为最后一个字符的索引,用于后续从后向前遍历  int j = s.length() - 1, i = j;  // 创建一个StringBuilder对象res,用于构建结果字符串  StringBuilder res = new StringBuilder();  // 当i大于等于0时,继续遍历  while (i >= 0) {  // 从后向前遍历,找到单词的起始位置(即首个不是空格的字符)  while (i >= 0 && s.charAt(i) != ' ') i--;  // 将从i+1到j的子字符串(即一个单词)添加到结果中,并在其后添加一个空格  // 注意:i+1是单词的起始位置,j+1会超出范围,因此使用j  res.append(s.substring(i + 1, j + 1) + " ");  // 跳过单词间的空格,继续寻找下一个单词的起始位置  while (i >= 0 && s.charAt(i) == ' ') i--;  // 更新j为下一个单词的尾字符索引  j = i;  }  // 将StringBuilder对象res转换为字符串,并删除结果字符串的首尾空格,然后返回  return res.toString().trim();  }  
}

6.【中等】Z 字形变换

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

  • 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:
    在这里插入图片描述
  • 之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。

请你实现这个将字符串进行指定行数变换的函数:

示例 :

  • 输入:s = “PAYPALISHIRING”, numRows = 4
  • 输出:“PINALSIGYAHRPI”
  • 解释:
    在这里插入图片描述
class Solution {  public String convert(String s, int numRows) {  // 如果numRows小于2,说明无需转换,直接返回原字符串  if(numRows < 2) return s;  // 创建一个ArrayList,用于存储每一行的StringBuilder对象  List<StringBuilder> rows = new ArrayList<StringBuilder>();  // 初始化每一行的StringBuilder对象  for(int i = 0; i < numRows; i++) rows.add(new StringBuilder());  // i表示当前字符应该放在哪一行  // flag表示i的移动方向,初始化为-1表示向下移动  int i = 0, flag = -1;  // 遍历字符串s中的每一个字符  for(char c : s.toCharArray()) {  // 将字符添加到对应的行中  rows.get(i).append(c);  // 如果当前行是第一行或者最后一行,则改变移动方向  if(i == 0 || i == numRows - 1) flag = - flag;  // 根据flag的值更新i的值,实现Z字形遍历  i += flag;  }  // 创建一个StringBuilder对象res,用于构建结果字符串  StringBuilder res = new StringBuilder();  // 遍历所有行,将每一行的内容添加到res中  for(StringBuilder row : rows) res.append(row);  // 将res转换为字符串并返回  return res.toString();  }  
}

68.【困难】文本左右对齐

  • 给定一个单词数组 words 和一个长度 maxWidth ,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本。
  • 你应该使用 “贪心算法” 来放置给定的单词;也就是说,尽可能多地往每行中放置单词。必要时可用空格 ’ ’ 填充,使得每行恰好有 maxWidth 个字符。
  • 要求尽可能均匀分配单词间的空格数量。如果某一行单词间的空格不能均匀分配,则左侧放置的空格数要多于右侧的空格数。
  • 文本的最后一行应为左对齐,且单词之间不插入额外的空格。

注意:

  • 单词是指由非空格字符组成的字符序列。
  • 每个单词的长度大于 0,小于等于 maxWidth。
  • 输入单词数组 words 至少包含一个单词。

示例 :

  • 输入:words = [“Science”,“is”,“what”,“we”,“understand”,“well”,“enough”,“to”,“explain”,“to”,“a”,“computer.”,“Art”,“is”,“everything”,“else”,“we”,“do”],maxWidth = 20
  • 输出:
    [
    “Science is what we”,
    “understand well”,
    “enough to explain to”,
    “a computer. Art is”,
    “everything else we”,
    "do "
    ]
class Solution {// 主要方法,用于实现单词的完全对齐功能public List<String> fullJustify(String[] words, int maxWidth) {List<String> ans = new ArrayList<String>(); // 初始化结果列表int right = 0, n = words.length; // 初始化指向当前行第一个单词的指针(right)及单词总数(n)// 循环处理每一行,直到所有单词被分配while (true) {int left = right; // 当前行的第一个单词在 words 的位置int sumLen = 0; // 统计这一行单词长度之和// 找出当前行可以容纳的单词,确保单词总长度加上空格不超过 maxWidthwhile (right < n && sumLen + words[right].length() + right - left <= maxWidth) {sumLen += words[right++].length(); // 累加单词长度并移动右指针}// 如果右指针到达末尾,说明处理的是最后一行if (right == n) {StringBuffer sb = join(words, left, n, " "); // 将剩余单词左对齐拼接,单词间单空格sb.append(blank(maxWidth - sb.length())); // 在行末填充空格以达到 maxWidthans.add(sb.toString()); // 添加到结果列表并返回return ans;}// 计算当前行的单词数和所需空格数int numWords = right - left;int numSpaces = maxWidth - sumLen;// 如果当前行只有一个单词,左对齐并在后面填充空格if (numWords == 1) {StringBuffer sb = new StringBuffer(words[left]);sb.append(blank(numSpaces)); // 在单词后添加足够的空格ans.add(sb.toString());continue;}// 多单词行处理int avgSpaces = numSpaces / (numWords - 1); // 平均每个空格数量int extraSpaces = numSpaces % (numWords - 1); // 额外的空格// 拼接单词,先拼接带有额外空格的单词,再拼接其余单词StringBuffer sb = new StringBuffer();sb.append(join(words, left, left + extraSpaces + 1, blank(avgSpaces + 1))); sb.append(blank(avgSpaces)); // 添加平均数量的空格sb.append(join(words, left + extraSpaces + 1, right, blank(avgSpaces)));ans.add(sb.toString()); // 添加到结果列表}}// 辅助方法,生成指定数量的空格字符串public String blank(int n) {StringBuffer sb = new StringBuffer();for (int i = 0; i < n; ++i) {sb.append(' ');}return sb.toString();}// 辅助方法,使用指定分隔符连接 words 中指定范围的单词public StringBuffer join(String[] words, int left, int right, String sep) {StringBuffer sb = new StringBuffer(words[left]);for (int i = left + 1; i < right; ++i) {sb.append(sep);sb.append(words[i]);}return sb;}
}

167.【中等】两数之和 II - 输入有序数组

  • 给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。
  • 以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。
  • 你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。
  • 你所设计的解决方案必须只使用常量级的额外空间。
public int[] twoSum(int[] numbers, int target) {  // 初始化两个指针,一个指向数组的开头,一个指向数组的末尾  int i = 0;  int j = numbers.length - 1;  // 当两个指针没有相遇时,执行循环  while (i < j) {  // 计算当前两个指针所指向的元素之和  int sum = numbers[i] + numbers[j];  // 如果和小于目标值,则移动左指针向右  if (sum < target) {  i++;  }   // 如果和大于目标值,则移动右指针向左  else if (sum > target) {  j--;  }   // 如果和等于目标值,则返回两个指针的索引(注意这里索引从1开始,所以加1)  else {  return new int[]{i+1, j+1};  }  }  // 如果循环结束仍未找到满足条件的两个数,则返回{-1, -1}  return new int[]{-1, -1};  
}

相关文章:

【LeetCode 随笔】面试经典 150 题【中等+困难】持续更新中。。。

文章目录 12.【中等】整数转罗马数字151.【中等】反转字符串中的单词6.【中等】Z 字形变换68.【困难】文本左右对齐167.【中等】两数之和 II - 输入有序数组 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您…...

SwiftUI中AppStorage的介绍使用

在Swift中&#xff0c;AppStorage是SwiftUI中引入的一个属性包装器&#xff0c;在这之前我们要存储一些轻量级的数据采用UserDefaults进行存取。而AppStorage用于从UserDefaults中读取值&#xff0c;当值改变时&#xff0c;它会自动重新调用视图的body属性。也就是说&#xff0…...

iCloud 照片到 Android 指南:帮助您快速将照片从 iCloud 传输到安卓手机

​ 概括 iOS 和 Android 之间的传输是一个复杂的老问题。将 iCloud 照片传输到 Android 似乎是不可能的。放心。现在的高科技已经解决了这个问题。尽管 Apple 和 Android 不提供传输工具&#xff0c;但您仍然有其他有用的选项。这篇文章与您分享了 5 个技巧。因此&#xff0c;…...

知识点总结

1、Uboot的流程调用&#xff1a; 1.1、cmd_process函数是怎么被调用到的&#xff1a; cmd_process在common/command.c 1.2、uboot阶段断电&#xff0c;后续起不来&#xff0c;可能要换线去使用&#xff0c;也许和电源线有关 2、git 相关使用 2.1 .gitignore相关的使用 1、…...

Python并发与异步编程

Python的并发与异步编程是两个不同的概念&#xff0c;但它们经常一起使用&#xff0c;以提高程序的性能和响应能力。以下是对这两个概念的详细讲解&#xff1a; 并发编程 (Concurrency) 并发编程是指在程序中同时执行多个任务的能力。Python提供了几种实现并发的机制&#xff…...

动态内存管理—C语言通讯录

目录 一&#xff0c;动态内存函数的介绍 1.1 malloc和free 1.2 calloc 1.3 realloc 1.4C/C程序的内存开辟 二&#xff0c;通讯录管理系统 动态内存函数的介绍 malloc free calloc realloc 一&#xff0c;动态内存函数的介绍 1.1 malloc和free void* malloc (…...

美光EMMC芯片丝印型号查询 8LK17/D9PSK, OXA17/JY997

问题说明 最近在使用美光EMMC的时候&#xff0c;发现通过芯片丝印查询不到 芯片的规格说明书&#xff1b; 经过查阅资料&#xff0c;发现美光的EMMC芯片 “由于空间限制&#xff0c;FBGA 封装组件具有与部件号不同的缩写部件标记”&#xff0c;需要通过官网查询丝印的FBGA cod…...

win32-鼠标消息、键盘消息、计时器消息、菜单资源

承接前文&#xff1a; win32窗口编程windows 开发基础win32-注册窗口类、创建窗口win32-显示窗口、消息循环、消息队列 本文目录 键盘消息键盘消息的分类WM_CHAR 字符消息 鼠标消息鼠标消息附带信息 定时器消息 WM_TIMER创建销毁定时器 菜单资源资源相关菜单资源使用命令消息的…...

springboot项目部署到linux服务器

springboot后端 修改前 修改后 vue前端 修改前 将地址中的 localhost改为 ip 重新生成war包 war上传到linux的tomcat的webapps下 其他环境配置和macOS大差不差 Tomcat安装使用与部署Web项目的三种方法_tomcat部署web项目-CSDN博客...

MagicLens:新一代图像搜索技术和产品形态

MagicLens&#xff1a;Self-Supervised Image Retrieval with Open-Ended Instructions MagicLens: 自监督图像检索与开放式指令 作者&#xff1a;Kai Zhang&#xff0c; Yi Luan&#xff0c; Hexiang Hu&#xff0c; Kenton Lee&#xff0c; Siyuan Qiao&#xff0c; Wenhu …...

[9] CUDA性能测量与错误处理

CUDA性能测量与错误处理 讨论如何通过CUDA事件来测量它的性能如何通过CUDA代码进行调试 1.测量CUDA程序的性能 1.1 CUDA事件 CPU端的计时器可能无法给出正确的内核执行时间CUDA事件等于是在你的CUDA应用运行的特定时刻被记录的时间戳&#xff0c;通过使用CUDA事件API&#…...

Java学习四

Random 随机数 数组 静态初始化数组 数组在计算机中的基本原理 数组的访问 什么是遍历 数组的动态初始化 动态初始化数组元素默认值规则 Java内存分配介绍 数组在计算机中的执行原理 使用数组时常见的一个问题 案例求数组元素最大值 public class Test1 {public static void ma…...

Vue 父组件使用refs来直接访问和修改子组件的属性或调用子组件的方法

步骤 1: 在子组件中定义要被修改的属性或方法 首先&#xff0c;在子组件中定义你想要父组件能够修改或调用的属性或方法。例如&#xff0c;我们有一个名为MyChildComponent的子组件&#xff0c;它有一个名为childData的数据属性和一个名为updateData的方法。 // 子组件 MyChi…...

范罗士、希喂、安德迈爆款宠物空气净化器哪款好?深度对比测评

作为一名深受养猫过敏困扰的铲屎官&#xff0c;我经常提醒新手铲屎官重视家里的空气环境。宠物的浮毛和皮屑不仅会引发过敏&#xff0c;还可能传播细菌和病毒。很多人以为普通空气净化器能解决问题&#xff0c;但这些产品并未针对宠物家庭的特殊需求。经过多次研究和测试&#…...

SAP OBYC自动记账 详解

在MM模块的许多操作都能实现在FI模块自动过账,如PO收货、发票验证、工单发料、向生产车间发料等等。不用说,一定需要在IMG中进行配置才可以实现自动处理。但SAP实现的这种自动配置的机制是怎样的呢?其实也并不复杂,让我们先以一种最简单的情况来了解实现原理和实现流程,然…...

《NoSQL数据库技术与应用》 MongoDB副本集

《NoSQL数据库技术与应用》 教学设计 课程名称&#xff1a;NoSQL数据库技术与应用 授课年级&#xff1a; 20xx年级 授课学期&#xff1a; 20xx学年第一学期 教师姓名&#xff1a; 某某老师 2020年5月6日 课题 名称 第4章 MongoDB副本集 计划学时 8课时 内容 分析 独立模式可…...

Flutter 中的 DropdownButtonFormField 小部件:全面指南

Flutter 中的 DropdownButtonFormField 小部件&#xff1a;全面指南 在Flutter中&#xff0c;DropdownButtonFormField是一个特殊的表单字段小部件&#xff0c;它结合了下拉选择框&#xff08;DropdownButton&#xff09;和表单字段&#xff08;FormField&#xff09;的功能。…...

哈希算法教程(个人总结版)

背景 哈希算法&#xff08;Hash Algorithm&#xff09;是一种将任意长度的输入&#xff08;也称为消息&#xff09;转换为固定长度的输出&#xff08;也称为哈希值、散列值、摘要&#xff09;的算法。哈希算法在计算机科学中有着广泛的应用&#xff0c;包括数据存储、数据检索…...

Nocobase快速上手 -第一个collection

本文记录Nocobase中如何创建collection&#xff0c;以及如何将collection展示到页面中&#xff0c;并且配置CRUD相应的操作. Collection 在NocoBase中&#xff0c;collection&#xff08;集合&#xff09;是用来组织和存储各种数据的容器&#xff0c;如订单、产品、用户、评论…...

吴恩达2022机器学习专项课程C2W2:2.19 sigmoid函数的替代方案 2.20如何选择激活函数 2.21 激活函数的重要性

这里写目录标题 引言sigmoid激活函数的局限1.回顾需求案例2.ReLU激活函数 常用的激活函数1.线性激活函数的解释 如何选择激活函数&#xff1f;1.选择输出层的激活函数2.选择隐藏层的激活函数 选择激活函数的总结1.输出层总结2.隐藏层总结3.TensorFlow设置激活函数 激活函数多样…...

循序渐进Docker Compose

文章目录 1.概述1.1 Docker Compose 定义1.2 Docker Compose背景1.3 Docker Compose核心概念 2.安装2.1 Official Repos2.2 Manual Installation2.3 v1.x 兼容性 3. YAML 配置说明3.1 Services3.2 Volumes & Networks 4. 解析 Service4.1 Pulling一个Image4.2 Building一个…...

怎样查看JavaScript中没有输出结果的数组值?

在JavaScript中&#xff0c;可以方便地定义和使用数组&#xff0c;对于已经定义的数组&#xff0c;怎样查看其值呢&#xff1f; 看下面的示例&#xff0c;并运行它。 上面的示例中&#xff0c;标签不完整&#xff0c;请补充完整再试运行。你知道少了什么标签么&#xff1f; 注…...

强化学习学习笔记-李宏毅

Policy Gradient actorenvreward function&#xff0c;env和reward是不能控制的&#xff0c;唯一可以变的是actor&#xff0c;Policy π \pi π是一个网络&#xff0c;参数为 θ \theta θ&#xff0c;输入是当前的观察&#xff0c;输出是采取的行为&#xff0c;例如游戏中输…...

吴恩达深度学习笔记:超 参 数 调 试 、 Batch 正 则 化 和 程 序 框 架(Hyperparameter tuning)3.8-3.9

目录 第二门课: 改善深层神经网络&#xff1a;超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第三周&#xff1a; 超 参 数 调 试 、 Batch 正 则 化 和 程 序 框 架&#xff08;Hyperparameter …...

SQL 语言:数据控制

文章目录 概述授权&#xff08;GRANT)销权&#xff08;REVOKE&#xff09;总结 概述 SQL语言中的数据控制权限分配是数据库管理的重要组成部分&#xff0c;它涉及到如何合理地为用户分配对数据库资源的访问和使用权限。 权限类型&#xff1a;在SQL中&#xff0c;权限主要分为…...

『ZJUBCA Weekly Feed 07』MEV | AO超并行计算机 | Eigen layer AVS生态

一文读懂MEV&#xff1a;区块链的黑暗森林法则 01 &#x1f4a1;TL;DR 这篇文章介绍了区块链中的最大可提取价值&#xff08;MEV&#xff09;概念&#xff0c;MEV 让矿工和验证者通过抢先交易、尾随交易和三明治攻击等手段获利&#xff0c;但也导致网络拥堵和交易费用增加。为了…...

正点原子延时函数delay_ms延时失效的原因

1、问题陈述 今天在测试小车程序的时候使用了如下代码&#xff0c;发现延时并没有达到期望的4s&#xff0c;而是仅仅延时了0.4s左右&#xff0c;本来以为少加了个0&#xff0c;最后在我多次测试下来&#xff0c;发现在延时大约超过2s的时候就会失效。 while(1){Set_Pwm(6000,60…...

MySQL 满足条件函数中使用查询最大值函数

在实际的数据库操作中&#xff0c;我们常常需要根据某些条件找到最大值并据此进行下一步的操作。例如&#xff0c;在一个包含订单信息的表中&#xff0c;可能需要找到特定客户的最大订单金额&#xff0c;并据此进行某些统计或决策。MySQL 提供了多种函数和查询方法&#xff0c;…...

Java | Leetcode Java题解之第101题对称二叉树

题目&#xff1a; 题解&#xff1a; class Solution {public boolean isSymmetric(TreeNode root) {return check(root, root);}public boolean check(TreeNode u, TreeNode v) {Queue<TreeNode> q new LinkedList<TreeNode>();q.offer(u);q.offer(v);while (!q.…...

【区块链】智能合约漏洞测试

打开Ganache vscode打开智能合约漏洞工程 合约内容 pragma solidity >0.8.3;contract EtherStore {mapping(address > uint) public balances;function deposit() public payable {balances[msg.sender] msg.value;emit Balance(balances[msg.sender]);}function with…...