首页 > 其他分享 >代码随想录 day8 || 344 反转字符串 541 反转字符串|| 54 替换数字

代码随想录 day8 || 344 反转字符串 541 反转字符串|| 54 替换数字

时间:2024-07-24 13:19:52浏览次数:10  
标签:right 反转 复杂度 随想录 bytes 字符串 strings left

344 反转字符串

func reverseString(s []byte)  {	
	// 思路 思考双指针
	left , right := 0, len(s) - 1
	for left < right {
		s[left], s[right] = s[right], s[left]
		left++
		right--
	}
}
//ez  没啥好说的
时间 n/2=n 空间1

541 反转字符串||

func reverseStr(s string, k int) string {
	// 思路快慢指针,慢指针每次移动k,快指针每次移动2k,然后交换0-k的字符
	// 通过索引取字符只能单字节,如果是多字节字符(中文),会产生问题
	if len(s) <= k {
		return reverse(s)
	}
	if len(s) > k && len(s) <= 2*k {
		return reverse(s[:k]) + s[k:]
	}

	// 快指针遍历
	start := 0
	for j := 2*k; j < len(s); j += 2*k {
		mid := (j + start) / 2	// 本次2k 区间的 中点
		s = s[:start] + reverse(s[start:mid]) + s[mid:] // 交换前k个字符
		start = j // 新的起始点
	}

	if len(s) - start <= k {
		return s[:start] + reverse(s[start:])
	}else if len(s) - start > k && len(s) - start <= 2*k {
		mid := start + k
		return s[:start] + reverse(s[start:mid]) + s[mid:]
	}

	return s
}

func reverse(s string) string {
	sli := []byte(s)
	left, right := 0, len(sli) - 1
	for left < right {
		sli[left], sli[right] = sli[right], sli[left]
		left++
		right--
	}
	return string(sli)
}

时间  反转操作k * 遍历次数 n/2k = n 空间 反转操作创建长度为k切片,字符串拼接操作创建长度为n的字符串 所以最终是n

// 在g语言中,字符串是不可变的,这意味着每次对字符串进行修改操作(如拼接)时,都会创建一个新的字符串,并分配新的内存地址。简而言之,字符串拼接操作会开辟新的内存地址。
// 思考,为什么我最开始这样写反转字符串函数是错误的呢?

func reverse(s string) string {
	left, right := 0, len(s)-1
	for left < right {
		s[left], s[right] = s[right], s[left]
		left++
		right--
	}
	return s
}

// 原因在于,字符串本质上是一个结构体
type string struct {
    data *byte
    len  int
}
// data存放指向底层数组的指针,len存储长度,并且对于字符串的字符而言,存储空间是连续的
// 字符串被程序设计为不可变的,所以字符串本身可以被索引,但是不能通过上面s[left], s[right] = s[right], s[left] 的方式对字符串产生修改

Go 中字符串拼接的几种方式及复杂度

1. 使用 + 操作符

s1 := "Hello"
s2 := "World"
s := s1 + s2
  • 复杂度:O(n)
    • 每次使用 + 拼接字符串时,都会创建一个新的字符串,并复制原有字符串的内容,这会导致时间复杂度和空间复杂度都是 O(n)。

2. 使用 fmt.Sprintf

import "fmt"

s1 := "Hello"
s2 := "World"
s := fmt.Sprintf("%s%s", s1, s2)
  • 复杂度:O(n)
    • fmt.Sprintf 会根据格式化字符串创建一个新的字符串,并复制内容,复杂度同样是 O(n)。

3. 使用 strings.Join

import "strings"

parts := []string{"Hello", "World"}
s := strings.Join(parts, "")
  • 复杂度:O(n)
    • strings.Join 会先计算所有字符串的总长度,然后一次性分配足够的内存来存储结果字符串,因此效率较高,复杂度为 O(n)。

4. 使用 bytes.Buffer

import (
    "bytes"
)

var buffer bytes.Buffer
buffer.WriteString("Hello")
buffer.WriteString("World")
s := buffer.String()
  • 复杂度:O(n)
    • bytes.Buffer 使用一个可变大小的缓冲区来高效地拼接字符串,不会频繁地分配内存,复杂度为 O(n)。

5. 使用 strings.Builder

import (
    "strings"
)

var builder strings.Builder
builder.WriteString("Hello")
builder.WriteString("World")
s := builder.String()
  • 复杂度:O(n)
    • strings.Builder 是专门为字符串拼接设计的,它的实现类似于 bytes.Buffer,但针对字符串进行了优化,复杂度为 O(n)。

总结

方法 代码示例 复杂度
+ 操作符 s := s1 + s2 O(n)
fmt.Sprintf s := fmt.Sprintf("%s%s", s1, s2) O(n)
strings.Join s := strings.Join(parts, "") O(n)
bytes.Buffer buffer.WriteString("Hello") O(n)
strings.Builder builder.WriteString("Hello") O(n)

在需要频繁拼接字符串的场景下,推荐使用 strings.Builderbytes.Buffer,它们的性能相对较高,且复杂度为 O(n)。

标签:right,反转,复杂度,随想录,bytes,字符串,strings,left
From: https://www.cnblogs.com/zhougongjin55/p/18320682

相关文章

  • Day8 字符串part1
    任务344.反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题。思路这道题比较简单,只需用双指针法交换头尾的值,然后往中间缩进即可。注意......
  • 代码随想录算法训练营第41天 |322.零钱兑换、279.完全平方数、139.单词拆分、多重背包
    322.零钱兑换https://leetcode.cn/problems/coin-change/description/代码随想录https://programmercarl.com/0322.零钱兑换.html#算法公开课279.完全平方数https://leetcode.cn/problems/perfect-squares/description/代码随想录https://programmercarl.com/0279.完全平......
  • 代码随想录算法训练营第40天 | 完全背包问题:完全背包基础理论、518.零钱兑换II、377.
    完全背包基础理论https://programmercarl.com/背包问题理论基础完全背包.html#其他语言版本卡码网完全背包例题https://kamacoder.com/problempage.php?pid=1052518.零钱兑换IIhttps://leetcode.cn/problems/coin-change-ii/description/代码随想录https://programmercarl......
  • Python查找字符串的CRC32
    我尝试获取字符串数据类型变量的CRC32,但出现以下错误:>>>message='helloworld!'>>>importbinascii>>>binascii.crc32(message)Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>TypeError:aby......
  • 如何将字符串转换为十进制数字?
    我有一个包含以下格式字符串的python列表:A1=['"29.0"','"65.2"','"75.2"']如何将这些字符串转换为十进制数字以对列表元素执行算术运算?可以使用float()函数将字符串转换为十进制数。以下是如何执行此操作的示例:A1=['"29.0"',�......
  • 代码随想录 day33 斐波那契数 | 爬楼梯 |使用最小花费爬楼梯
    斐波那契数斐波那契数解题思路利用代码随想录给出的解题模板进行解题。先确定dp数组和dp下标的含义,之后需要确定遍历的顺序,接着我们通过枚举获得遍历的规矩,最后确定dq的初始值。知识点动态规划心得第一次做动态规划,主要是掌握基本的解题思路,了解一下到底是怎么解决问题的......
  • 41-50题矩阵和字符串 在Java中,将大写字符转换为小写字符的方法主要有以下几种:
    20240723一、数组最后几个和字符串的两个448.找到所有数组中消失的数字(和645.错误的集合差不多)283.移动零118.杨辉三角119.杨辉三角II661.图片平滑器(没看懂)598.区间加法II566.重塑矩阵303.区域和检索-数组不可变520.检测大写字母125.验证回文串二、在Jav......
  • 代码随想录哈希表第二天:四数相加2、三数之和、四数之和、赎金信
    详细可移步个人代码随想录打卡四数相加使用2次,2层for循环。即可确定和值,然后使用一个map来记录第一个for循环的值,再第二次for循环中找,并记录次数即可。代码如下:importjava.util.HashMap;importjava.util.Map;classSolution{publicintfourSumCount(int[]n......
  • 简答理解【字符指针】,存放字符串首地址???
    2024-07-23笔记-5作者(Author):仟濹(网名)字符指针①定义指针的时候也赋值字符串为什么给一个指针赋值字符串的时候也可以打印出来整个字符串???//eg:char*p="abcdefg";printf("%s",p);//abcdefgputs(p);//同理printf("%s",p+1);//bcdefgputs(p+1);/......
  • 字符串数组
    一、二分查找法将一个有序的数列取中值,判断数在哪一段,每次筛选原来的一半,重复多次二、字符串数组(容器,用来存放字符)1.初始化内容:chars[100]=“hello”(字符串常量)字符串结束标志:\0(空字符)单一性、连续性、有序性2.输出字符串puts(s)=puts(&s[0])3.输入字符串scanf......