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

[Go版]算法通关村第十二关黄金——字符串冲刺题

目录

题目:最长公共前缀

题目链接:LeetCode-14. 最长公共前缀
在这里插入图片描述

解法1:纵向对比-循环内套循环写法

以第一个子字符串为标准,遍历其每个字符时,内嵌遍历其余子字符串的对应字符是否一致。不一致时,则返回当前字符之前的子字符串。

复杂度:时间复杂度 O ( n ∗ m ) O(n*m) O(nm)、空间复杂度 O ( 1 ) O(1) O(1)

  • 时间复杂度:其中 n 是字符串平均长度,m 是字符串数组的长度。

Go代码

func longestCommonPrefix(strs []string) string {length := len(strs)if length==1 {return strs[0]}chlen := len(strs[0])for i:=0; i<chlen; i++ {// 用第一个子字符串的字符作为比较ch := strs[0][i]for j, v := range strs {if j == 0 {continue}// 子字符串的长度比第一个短 或者 出现比较字符不同if i == len(v) || v[i] != ch {return string(strs[0][:i])}}}return strs[0]
}

解法2:横向对比-两两对比(类似合并K个数组、合并K个链表)

  1. 先让前两个子字符串对比得到公共前缀
  2. 再将此公共前缀作和下一个子字符串对比得到公共前缀
  3. 如此循环到末尾,返回最后的公共前缀即可
  4. 优化:遍历过程中如果公共前缀已经是空字符串了,则可直接返回空字符串。

相比于解法1的优点:将逻辑分解到两个函数中,使代码更加模块化和可维护。

复杂度:时间复杂度 O ( n ∗ m ) O(n*m) O(nm)、空间复杂度 O ( 1 ) O(1) O(1)

  • 时间复杂度:其中 n 是字符串平均长度,m 是字符串数组的长度。

Go代码

func longestCommonPrefix(strs []string) string {length := len(strs)if length == 1 {return strs[0]}str := strs[0]for i:=1; i<length; i++ {str = getCommonPrefix(str, strs[i])if str == "" {return ""}}return str
}func getCommonPrefix(str1, str2 string) string {length2 := len(str2)for i, v := range str1 {val := byte(v)if i == length2 || val != str2[i] {return string(str1[:i])}}return str1
}

题目:压缩字符串

题目链接:LeetCode-443. 压缩字符串
在这里插入图片描述

解法1:读写指针 + 次数统计 + 顺向思维处理次数输出

  1. 安排读写指针,分别指向要写的位置,和读的位置,两指针首先指向第一个字符

  2. 如果是相同时最后一个元素的标记,或者 读指针的字符和写指针不同时

    1. 统计总次数,区分是否 >1
      • 大于1:区分是否 >= 10
        • 小于10:仅追加一个数字
        • 大于10:不断除10,得到可除次数,和除10的最后余数
          1. 追加最后余数
          2. 遍历可除次数,追加数值0
          3. 根据可除次数,用总次数除了10的可除次数次方,得到余数,追加余数
    2. 如果是相同时最后一个元素的标记,到这里直接返回写指针+1即可
    3. 更新对比字符为当前字符,追加对比字符
    4. 总次数还原为1,读指针++
    5. 如果是最后一个元素,到这里直接返回写指针+1即可
  3. 相同时,总次数++

    • 如果是最后一个元素,添加标记(这里只为加上其相同次数)

复杂度:时间复杂度 O ( n ) O(n) O(n)、空间复杂度 O ( 1 ) O(1) O(1)

Go代码

func compress(chars []byte) int {length := len(chars)if length == 0 || length == 1 {return length}left, right := 0, 1 // left写 right读num := 1    //次数统计ch := chars[0]lastone := falsefor lastone || right < length {if lastone || chars[right] != chars[left] {// 追加长度if num > 1 {// 要追加多个长度if num >= 10 {tmpnum := numcount10 := 1// 明确有几个10for tmpnum >= 10 {tmpnum = tmpnum/10if tmpnum >= 10 {count10++}}// 追加大于10的首个数字left++chars[left] = byte(tmpnum + '0')   for i:=1; i<count10; i++ {// 补零left++chars[left] = '0'}// 追加大于等于10时的余数f10 := math.Pow(10, float64(count10))yu := num % int(f10)if yu >= 0 {left++chars[left] = byte(yu + '0')}} else {    //只追加一个长度left++chars[left] = byte(num + '0')}}if lastone {return left+1}ch = chars[right]// 追加新字符left++chars[left] = chnum = 1right++// 如果是最后一个元素if right == length {return left+1}} else {num++right++if right == length {lastone = true}}}return left+1
}

解法2:读写起始三指针 + 逆向思维处理次数输出(优化解法1)

优化点:

  1. 无需用变量循环时累加统计总次数:让一个起始指针指向当前统计字符的首位置,当遍历到该字符末尾时,尾索引-首索引+1=总次数
  2. 将正向计算追加>10时的最后余数、可除10次数、余数改为:追加依次除10得到的余数,最后反转该段数字区间即可。
  3. 读指针和下一个不同时处理当前,此时包含了最后一个字符的场景。解法1中读指针和写指针不同时处理的逻辑就没法包含最后一个字符,需要考虑最后一个字符时是和之前一致还是不同的情况。

复杂度:时间复杂度 O ( n ) O(n) O(n)、空间复杂度 O ( 1 ) O(1) O(1)

Go代码

func compress(chars []byte) int {length := len(chars)if length == 0 || length == 1 {return length}left, right, start := 0, 0, 0for ; right < length; right++ {if right == length-1 || chars[right] != chars[right+1] {chars[left] = chars[right]left++count := right-start+1site := leftif count > 1 {for count > 0 {n := count%10chars[left] = byte(n + '0')left++count = count/10}reverse(chars, site, left-1)}start = right+1}}return left
}
func reverse(chars []byte, left int, right int) {if left >= right {return}for left <= right {chars[left], chars[right] = chars[right], chars[left]left++right--}
}

相关文章:

[Go版]算法通关村第十二关黄金——字符串冲刺题

目录 题目&#xff1a;最长公共前缀解法1&#xff1a;纵向对比-循环内套循环写法复杂度&#xff1a;时间复杂度 O ( n ∗ m ) O(n*m) O(n∗m)、空间复杂度 O ( 1 ) O(1) O(1)Go代码 解法2&#xff1a;横向对比-两两对比&#xff08;类似合并K个数组、合并K个链表&#xff09;复…...

neovim为工作区添加本地clangd配置

1 背景 尝试使用neovim开发stm32&#xff0c;使用clangd作为LSP提供代码补全等功能。 2 思路 使用stm32cubeMX生成一个基于makefile的stm32工程。 使用bear或compiledb基于makefile生成compile_commands.json文件。 为clangd配置--query-driver选项&#xff0c;使其使用arm…...

信号处理--基于EEG脑电信号的眼睛状态的分析

本实验为生物信息学专题设计小项目。项目目的是通过提供的14导联EEG 脑电信号&#xff0c;实现对于人体睁眼和闭眼两个状态的数据分类分析。每个脑电信号的时长大约为117秒。 目录 加载相关的库函数 读取脑电信号数据并查看数据的属性 绘制脑电多通道连接矩阵 绘制两类数据…...

Redis高可用:主从复制详解

目录 1.什么是主从复制&#xff1f; 2.优势 3.主从复制的原理 4.全量复制和增量复制 4.1 全量复制 4.2 增量复制 5.相关问题总结 5.1 当主服务器不进行持久化时复制的安全性 5.2 为什么主从全量复制使用RDB而不使用AOF&#xff1f; 5.3 为什么还有无磁盘复制模式&#xff…...

[Flutter]有的时候调用setState(() {})报错?

先看FlutterSDK的原生类State中有一个变量mounted。 abstract class State<T extends StatefulWidget> with Diagnosticable {/// mounted的作用是&#xff0c;此State对象当前是否在树中。/// 在创建State对象之后&#xff0c;在调用initState之前&#xff0c;框架通过…...

利用屏幕水印学习英语单词,无打扰英语单词学习

1、利用屏幕水印学习英语单词&#xff0c;不影响任何鼠标键盘操作&#xff0c;不影响工作 2、利用系统热键快速隐藏&#xff08;ALT1键 隐藏与显示&#xff09; 3、日积月累单词会有进步 4、软件下载地址: 免安装&#xff0c;代码未加密&#xff0c;安全的屏幕水印学习英语…...

开学必备物品清单!这几款优先考虑!

​马上就要开学了&#xff0c;同学们也要准备一系列开学用品&#xff0c;方便我们的学习生活&#xff0c;那有哪些数码物品可以在开学前准备的呢&#xff0c;接下来给大家安利几款很不错很实用的数码好物&#xff01; 推荐一&#xff1a;南卡00压开放式蓝牙耳机 南卡00压开放式…...

聊聊调制解调器

目录 1.什么是调制解调器 2.调制解调器的工作原理 3.调制解调器的作用 4.调制解调器未来发展 1.什么是调制解调器 调制解调器&#xff08;Modem&#xff09;是一种用于在数字设备和模拟设备之间进行数据传输的设备。调制解调器将数字数据转换为模拟信号进行传输&#xff0c;…...

Go语言入门指南:基础语法和常用特性(下)

上一节&#xff0c;我们了解Go语言特性以及第一个Go语言程序——Hello World&#xff0c;这一节就让我们更深入的了解一下Go语言的**基础语法**吧&#xff01; 一、行分隔符 在 Go 程序中&#xff0c;一行代表一个语句结束。每个语句不需要像 C 家族中的其它语言一样以分号 ;…...

【MFC常用问题记录】

MFC 记录 MFC的edit control控件显示1.控件添加变量M_edit后&#xff1a;2.控件ID为IDC_EDIT1: 线程函数使用 MFC的edit control控件显示 1.控件添加变量M_edit后&#xff1a; CString str; int x 10; str.Format(_T("%d"),x); M_edit.SetWindowText(str)2.控件ID…...

ThreadLocal内存泄漏问题

引子&#xff1a; 内存泄漏&#xff1a;是指本应该被GC回收的无用对象没有被回收&#xff0c;导致内存空间的浪费&#xff0c;当内存泄露严重时会导致内存溢出。Java内存泄露的根本原因是&#xff1a;长生命周期的对象持有短生命周期对象的引用&#xff0c;尽管短生命周期对象已…...

微服务基础概念【内含图解】

目录 拓展补充&#xff1a; 单体架构 分布式架构 面向服务的体系结构 云原生 微服务架构 什么是微服务&#xff1f; 微服务定义 拓展补充&#xff1a; 单体架构 单体架构&#xff1a;将业务的所有功能集中在一个项目中开发&#xff0c;最终打成一个包部署 优点&#x…...

Dockerfile创建 LNMP 服务+Wordpress 网站平台

文章目录 一.环境及准备工作1.项目环境2.服务器环境3.任务需求 二.Linux 系统基础镜像三.docker构建Nginx1.建立工作目录上传安装包2.编写 Dockerfile 脚本3.准备 nginx.conf 配置文件4.生成镜像5.创建自定义网络6.启动镜像容器7.验证 nginx 四.docker构建Mysql1. 建立工作目录…...

消息中间件篇

消息中间件篇 RabbitMQ 如何保证消息不丢失 面试官&#xff1a; RabbitMQ如何保证消息不丢失 候选人&#xff1a; 嗯&#xff01;我们当时MYSQL和Redis的数据双写一致性就是采用RabbitMQ实现同步的&#xff0c;这里面就要求了消息的高可用性&#xff0c;我们要保证消息的不…...

基本定时器

1.简介 1. 基本定时器 TIM6 和 TIM7 包含一个 16 位自动重载计数器 2. 可以专门用于驱动数模转换器 (DAC), 用于触发 DAC 的同步电路 3. 16 位自动重载递增计数器 4. 16 位可编程预分频器 5. 计数器溢出时, 会触发中断/DMA请求 从上往下看 1.开始RCC供给定时器的时钟 RCC_APB1…...

MySQL 中文全文检索

创建索引&#xff08;MySQL 5.7.6后全文件索引可用WITH PARSER ngram&#xff0c;针对中文&#xff0c;日文&#xff0c;韩文&#xff09; ALTER TABLE 表 ADD FULLTEXT 索引名 (字段) WITH PARSER ngram;或者CREATE FULLTEXT INDEX 索引名 ON 表 (字段) WITH PARSER ngram; …...

Redis——list类型详解

概要 Redis中的list类型相当于双端队列&#xff0c;支持头插&#xff0c;头删&#xff0c;尾插&#xff0c;尾删&#xff0c;并且列表中的内容是可以重复的。 如果搭配使用rpush和lpop&#xff0c;那么就相当于队列 如果搭配使用rpush和rpop&#xff0c;那么就相当于栈 lpu…...

npm 安装 git 仓库包

安装 #v1.0.0 代表版本, 例如打了仓库一个tag叫v1.0.0; 如果不指定版本则默认是最新的代码 npm install githttp://mygitlab.xxxx.net/chengchongzhen/hex-event-track.git#v1.0.0在项目根目录执行以下命令, 此时你的代码会被链接到npm的全局仓库, 类似执行了 npm install xxx …...

问题来了!你知道你穿的防砸劳保鞋的保护包头都是什么材料

防砸劳保鞋是较为常见的一种劳保鞋&#xff0c;用于作业过程中保护工人的脚&#xff0c;减少或避免被坠落物、重物砸伤或压伤脚部的工作鞋。防砸安全鞋鞋前头装有防护包头&#xff0c;具有耐压力和抗冲击性能。主要适用于矿山、机械、建筑、钢铁、冶金、运输等行业。 你穿的防砸…...

计算机网络-物理层(三)编码与调制

计算机网络-物理层&#xff08;三&#xff09;编码与调制 在计算机网络中&#xff0c;计算机需要处理和传输用户的文字、图片、音频和视频&#xff0c;它们可以统称为消息 数据是运输信息的实体&#xff0c;计算机只能处理二进制数据&#xff0c;也就是比特0和比特1。计算机中…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

DiscuzX3.5发帖json api

参考文章&#xff1a;PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下&#xff0c;适配我自己的需求 有一个站点存在多个采集站&#xff0c;我想通过主站拿标题&#xff0c;采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...

aardio 自动识别验证码输入

技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”&#xff0c;于是尝试整合图像识别与网页自动化技术&#xff0c;完成了这套模拟登录流程。核心思路是&#xff1a;截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...

海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》

近日&#xff0c;嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》&#xff0c;海云安高敏捷信创白盒&#xff08;SCAP&#xff09;成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天&#xff0c;网络安全已成为企业生存与发展的核心基石&#xff0c;为了解…...