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

news2025/1/16 19:04:40

目录

题目:最长公共前缀

题目链接: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 := false
    for lastone || right < length {
        if lastone || chars[right] != chars[left] {
            // 追加长度
            if num > 1 {
                // 要追加多个长度
                if num >= 10 {
                    tmpnum := num
                    count10 := 1
                    // 明确有几个10
                    for tmpnum >= 10 {
                        tmpnum = tmpnum/10
                        if 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] = ch
            num = 1
            right++
            // 如果是最后一个元素
            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, 0
    for ; right < length; right++ {
        if right == length-1 || chars[right] != chars[right+1] {
            chars[left] = chars[right]
            left++
            count := right-start+1
            site := left
            if count > 1 {
                for count > 0 {
                    n := count%10
                    chars[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--
    }
}

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

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

相关文章

antd5源码调试环境搭建(window系统)

将antd源码克隆至本地 $ git clone gitgithub.com:ant-design/ant-design.git $ cd ant-design $ npm install $ npm start前提安装python3、安装node版本18版本 不然后续安装依赖会报python3相关的错误。 项目需要使用git 初始化 不然会报husky相关的错误 git init重新安…

元宇宙电商—NFG系统:区块链技术助力商品确权。

在国内&#xff0c;以“数字藏品”之名崛起以来&#xff0c;其与NFT的对比就从未停歇。从上链模式到数据主权&#xff0c;从炒作需求到实际应用&#xff0c;从售卖形式到价值属性&#xff0c;在各种抽丝剥茧般的比较中&#xff0c;围绕两者孰优孰劣的讨论不绝于耳。 NFT的每一…

git 恢复丢失的代码

1.进入代码目录&#xff0c;打开git Bash,执行命令&#xff1a;git reflog&#xff0c;可以查看到提交记录编号&#xff1b;可以看git库查看记录&#xff0c;看丢失的是那次提交的代码&#xff1b; 2.执行命令&#xff1a;git cherry-pick ID ID就是记录编号&#xff1b; 3…

车载APP软件外包开发通讯

车载APP与车辆之间的通信方式和特点会因为不同的技术和场景而有所不同。以下是一些常见的车载APP与车辆通信方式以及它们的特点&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.蓝牙连接&#xff1a…

GuLi商城-前端基础Vue-生命周期和钩子函数

下图展示了实例的生命周期。你不需要立马弄明白所有的东西&#xff0c;不过随着你的不断学习和使用&#xff0c;它 的参考价值会越来越高。 VUE 的生命周期指的是组件在创建、运行和销毁过程中所经历的一系列事件&#xff0c;通过这些事件可以 让开发者在不同阶段进行相应的…

仿牛客论坛项目day4|开发社区登录模块

1、发送邮件 使用spring-boot-starter-mail这个包 2、开发注册功能 &#xff08;1&#xff09;访问注册页面 功能拆解&#xff1a; 点击顶部的注册按钮&#xff0c;打开注册页面 新增文件&#xff1a;controller->login 具体实现过程&#xff1a; 增加一个getregist…

图片文字识别-管理敏感词

目录 什么是OCR Tess4j案例 图片文字识别-管理敏感词 什么是OCR OCR &#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;是指电子设备&#xff08;例如扫描仪或数码相机&#xff09;检查纸上打印的字符&#xff0c;通过检测暗、亮的模式确定其…

win10新镜像和Navicat连接orcle数据库nodejs安装,xshell

原版软件 (itellyou.cn) 使用navicat远程连接oracle数据库_True To The Core的博客-CSDN博客 Navicat Premium 12连接Oracle时提示oracle library is not loaded的问题解决_泥巴城的博客-CSDN博客 下载最新orcle客户端就可以正常连接了 nodejs安装和环境配置-Windows_nodejs…

C++ Builder 关于TRichEdit的字符颜色标记处理

//积累经验每一天&#xff0c;以后忘记好搜索 void __fastcall TForm2::btn3Click(TObject *Sender) { //初始化验证 mmo->SelStart0; mmo->SelLengthmmo->Text.Length(); mmo->SelAttributes->ColorclBlack; String CGhEd…

数字孪生助力智慧水务:科技创新赋能水资源保护

智慧水务中&#xff0c;数字孪生有着深远的作用&#xff0c;正引领着水资源管理和环境保护的创新变革。随着城市化和工业化的不断推进&#xff0c;水资源的可持续利用和管理愈发显得重要&#xff0c;而数字孪生技术为解决这一挑战提供了独特的解决方案。 数字孪生技术&#xf…

教育行业软文怎么写,媒介盒子无偿分享

随着产业升级和技术变革、信息的智能化、数字化发展&#xff0c;也为教育行业带来了新的增长点&#xff0c;在线教育课程类型丰富多元&#xff0c;新课程不断涌现。在激烈的市场竞争环境下&#xff0c;教育机构如何根据市场实行差异化战略并加强自身品牌建成为挑战。 如今&…

牛客小白月赛70E题题解

文章目录 [ 小d的博弈](https://ac.nowcoder.com/acm/contest/53366/E)问题建模问题分析1.分析操作代码 小d的博弈 问题建模 给定一个n*m的矩形&#xff0c;有两个玩家&#xff0c;每次轮流选择某行或某列&#xff0c;然后以该行或该列将矩形分成两个&#xff0c;且取面积较小…

Spring Boot实践八--用户管理系统

1&#xff0c;技术介绍 技术选型功能说明springboot是一种基于 Spring 框架的快速开发应用程序的框架&#xff0c;它的主要作用是简化 Spring 应用程序的配置和开发&#xff0c;同时提供一系列开箱即用的功能和组件&#xff0c;如内置服务器、数据访问、安全、监控等&#xff…

一次性讲清OAuth2.0授权

文章目录 什么是OAuth2.0授权OAuth2.0工作原理OAuth2.0应用示例OAuth2.0授权模式授权码模式简化模式设备码模式 如何申请应用及密钥等信息 什么是OAuth2.0授权 OAuth2.0是一种用于授权的开放标准&#xff0c;它允许用户授权第三方应用访问其在另一个应用中存储的信息&#xff…

网络每日一练

吴泽彬 C Ip 网络层 Tcp udp 传输层&#xff0c; Http 应用层 收起 1 回复 发布于 2019-10-11 12:07 举报 fighting2016 Java A类地址中的私有地址和保留地址&#xff1a; ①10.0.0.0到10.255.255.255是私有地址&#xff08;所谓的私有地址就是在互联网上不使用&#xff0c;而被…

ASEMI探索整流桥GBU814的独特优势和应用领域

编辑-Z 整流桥GBU814在众多电子元件中独树一帜&#xff0c;可在多种设备中发挥其重要作用。作为一款集高效性能和可靠稳定性于一身的整流桥&#xff0c;GBU814已在全球范围内赢得了广泛的好评。在这篇文章中&#xff0c;我们将详细介绍GBU814整流桥的优势和应用领域。 让我们首…

对比 VPN 与远程桌面软件,为什么远程桌面更优越

数字格局不断演变&#xff0c;我们的工作和连接方式也在不断变化。企业纷纷转向远程运营&#xff0c;有关推进向远程过渡的最佳技术的争论从未停止。争论的焦点通常是虚拟专用网络&#xff08;VPN&#xff09;和远程桌面软件。 长期以来&#xff0c;VPN 一直被用作访问公司网络…

pytorch 实现VGG

VGG全称是Visual Geometry Group&#xff0c;因为是由Oxford的Visual Geometry Group提出的。AlexNet问世之后&#xff0c;很多学者通过改进AlexNet的网络结构来提高自己的准确率&#xff0c;主要有两个方向&#xff1a;小卷积核和多尺度。而VGG的作者们则选择了另外一个方向&a…

OJ练习第150题——分割回文串

分割回文串 力扣链接&#xff1a;131. 分割回文串 题目 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 示例 Java代码 class Solution {List<List…

锐捷无线产品运维(Web登录、 命令行登录)

目录 登录AP产品 Console登录&#xff08;只可以现场登录&#xff09; Web/Telnet/SSH登录&#xff08;可以现场、远程登录&#xff09; 配置AP的管理地址 通过Web界面远程登录 通过Telnet、SSH等命令行的方式登录 登录AC产品 Console登录&#xff08;只可以现场登录&a…