go语言面试题:最长公共前缀

简介: go语言面试题:最长公共前缀

以下是使用 go 语言实现最长公共前缀的代码,已加上详细注释:

package main
import "fmt"
// longestCommonPrefix 函数接收一个字符串数组,返回这些字符串的最长公共前缀
func longestCommonPrefix(strs []string) string {
    if len(strs) == 0 { // 如果数组为空,则返回空字符串
        return ""
    }
    prefix := strs[0] // 假设第一个字符串为最长公共前缀
    for i := 1; i < len(strs); i++ { // 遍历剩下的字符
        for len(prefix) > 0 { // 如果当前公共前缀不为空,则进行以下操作
            if len(strs[i]) >= len(prefix) && strs[i][:len(prefix)] == prefix { 
                /*
                 * 如果当前字符串长度比公共前缀长,并且以该前缀开头。
                 * 则更新前缀并查找下一个字符串
                 */
                break // 跳出内层循环
            } else { // 否则,从后往前缩短前缀
                prefix = prefix[:len(prefix)-1] // 将前缀去除最后一位
            }
        }
        if len(prefix) == 0 { // 如果没有备选前缀了
            return "" // 直接返回空字符串
        }
    }
    return prefix // 返回最长公共前缀
}
func main() {
    strs := []string{"flower", "flow", "flight"} // 测试用例,期待结果为 "fl"
    result := longestCommonPrefix(strs) // 调用最长公共前缀函数
    fmt.Println(result) // 输出结果
}

在此代码中,我们首先通过假设第一个字符串为最长公共前缀(prefix := strs[0])来进行迭代。然后我们以该主导前缀的长度为基础,检查当前位置是否与所有其他字符串相符合。如果不完整并且我们没有找到新的前缀,则将当前前缀末尾截掉一个字符(prefix = prefix[:len (prefix)-1])。

当这个例程完成并且所有其他字符串都已经被检查(for i:= 1; i <len (strs); i ++),则最终的返回应该是我们已经找到的最长公共前缀。

相关文章
|
17天前
|
JSON 测试技术 Go
零值在go语言和初始化数据
【7月更文挑战第10天】本文介绍在Go语言中如何初始化数据,未初始化的变量会有对应的零值:bool为`false`,int为`0`,byte和string为空,pointer、function、interface及channel为`nil`,slice和map也为`nil`。。本文档作为指南,帮助理解Go的数据结构和正确使用它们。
68 22
零值在go语言和初始化数据
|
3天前
|
缓存 安全 编译器
Go语言的goroutine是基于什么线程模型实现的
Go语言的goroutine是基于什么线程模型实现的?
13 3
|
8天前
|
JSON 中间件 Go
Go语言Web框架Gin介绍
【7月更文挑战第19天】Gin是一个功能强大、高性能且易于使用的Go语言Web框架。它提供了路由、中间件、参数绑定等丰富的功能,帮助开发者快速构建高质量的Web应用。通过本文的介绍,你应该对Gin框架有了初步的了解,并能够使用它来开发简单的Web服务。随着你对Gin的深入学习和实践,你将能够利用它构建更复杂、更强大的Web应用。
|
13天前
|
Cloud Native Java Go
为什么要学习Go语言?
GO logo的核心理念,即简单胜于复杂。使用现代斜体无衬线字体与三条简单的运动线相结合,形成一个类似于快速运动的两个轮子的标记,传达速度和效率。字母的圆形暗示了GO地鼠的眼睛,创造了一个熟悉的形状,让标记和吉祥物很好地搭配在一起。
27 4
|
17天前
|
存储 Go
go语言中fmt格式化包和内置函数汇总
【7月更文挑战第10天】本文介绍fmt包和`Errorf`用于创建格式化的错误消息。`fmt`包还涉及一些接口,如`Formatter`、`GoStringer`、`ScanState`、`Scanner`和`Stringer`,支持自定义格式化和输入/输出处理。
25 1
|
17天前
|
Go
go语言中格式化输出的占位符
【7月更文挑战第10天】`fmt` 包在 Go 语言中用于格式化输出,包括不同类型的占位符:%v(默认格式)、%+v(带字段名的结构体)、%#v(Go语法表示)、%T(类型表示)、%%(百分号)。布尔值用%t,整数有%b、%c、%d、%o、%q、%x、%X和%U。浮点数和复数用%b、%e、%E、%f、%g、%G。字符串和字节切片用%s、%q、%x、%X。指针用%p。占位符可配合+、-、#、空格和0进行调整。宽度和精度控制输出格式,例如 %.4g 控制小数精度。Go 没有 `%u`,但无符号整数默认打印为正数。运算符包括逻辑、比较、加减、乘除、移位、按位和按位异或等。
23 1
|
9天前
|
Oracle 关系型数据库 MySQL
|
15天前
|
安全 Go
Go语言map并发安全,互斥锁和读写锁谁更优?
Go并发编程中,`sync.Mutex`提供独占访问,适合读写操作均衡或写操作频繁的场景;`sync.RWMutex`允许多个读取者并行,适用于读多写少的情况。明智选择锁可提升程序性能和稳定性。示例展示了如何在操作map时使用这两种锁。
29 0
|
15天前
|
安全 Go 开发者
Go语言map并发安全使用的正确姿势
在Go并发编程中,由于普通map不是线程安全的,多goroutine访问可能导致数据竞态。为保证安全,可使用`sync.Mutex`封装map或使用从Go 1.9开始提供的`sync.Map`。前者通过加锁手动同步,后者内置并发控制,适用于多goroutine共享。选择哪种取决于具体场景和性能需求。
16 0
|
15天前
|
存储 安全 Java
Go语言中的map为什么默认不是并发安全的?
Go语言的map默认不保证并发安全,以优化性能和简洁性。官方建议在需要时使用`sync.Mutex`保证安全。从Go 1.6起,并发读写map会导致程序崩溃,鼓励开发者显式处理并发问题。这样做的哲学是让代码更清晰,并避免不必要的性能开销。
20 0