当前位置: 首页 > 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。计算机中…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...

从物理机到云原生:全面解析计算虚拟化技术的演进与应用

前言&#xff1a;我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM&#xff08;Java Virtual Machine&#xff09;让"一次编写&#xff0c;到处运行"成为可能。这个软件层面的虚拟化让我着迷&#xff0c;但直到后来接触VMware和Doc…...

WEB3全栈开发——面试专业技能点P7前端与链上集成

一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染&#xff08;SSR&#xff09;与静态网站生成&#xff08;SSG&#xff09; 框架&#xff0c;由 Vercel 开发。它简化了构建生产级 React 应用的过程&#xff0c;并内置了很多特性&#xff1a; ✅ 文件系…...

高分辨率图像合成归一化流扩展

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 1 摘要 我们提出了STARFlow&#xff0c;一种基于归一化流的可扩展生成模型&#xff0c;它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流&#xff08;TARFlow&am…...