首页 > 其他分享 >[代码随想录]Day07-字符串 part01

[代码随想录]Day07-字符串 part01

时间:2023-08-02 23:35:58浏览次数:55  
标签:string part01 随想录 代码 Day07 len func res 字符串

题目:344. 反转字符串

思路:

每次把最前面和最后面的交换位置即可

strings库里没有反转的方法

——这个反转是之后几个题的一个基础

代码:

双指针调换位置

func reverseString(s []byte)  {
    l, r := 0, len(s) - 1 // 最前面的元素,最后面的元素
    for l < r {
        s[l], s[r] = s[r], s[l] // 调换位置
        l++
        r--
    }
}

参考:

代码随想录

题目:541. 反转字符串 II

思路:

首先,这道题的难点在于对Go的字符串理解,Go的字符串不能修改,所以首先要转换成string类型。

而且要注意的一点是[]byte是切片类型,它的底层是数组指针,因此reverse传进去的参数是会修改的。

之后就是记得转换回string类型

代码:

func reverseStr(s string, k int) string {
    lens := len(s)
    ss := []byte(s) // 转换成[]byte进行操作
    for i := 0 ;i < lens ; i += 2 * k{ // 每次都要加2*k
        if lens - i >= k { // 如果剩余的数量大于k那就把前k个翻转
            reverse(ss[i:i+k]) 
        }else { // 剩下的不足k,全部翻转
            reverse(ss[i:])
        }
    }
    return string(ss) // 转换回string
}

func reverse(s []byte){
    l, r := 0, len(s) - 1
    for l < r {
        s[l], s[r] = s[r], s[l]
        l++
        r--
    }
}

参考:

代码随想录

题目:剑指 Offer 05. 替换空格

思路:

方法一:遍历一遍,遇到空格,添加"%20"

方法二:使用stringsReplace方法——func Replace(s, old, new string, n int) string;其中s是要进行操作的字符串,old是替换前的字段,new是替换后的字段,n是替换的个数(-1就是全部)。

方法三:直接进行修改,增加长度,然后从后向前遍历。

代码1:

遍历

func replaceSpace(s string) string {
    res := "" // 结果
    for i := 0; i < len(s); i++ { // 遍历
        if s[i] == ' ' {  // 单个是byte类型
            res += "%20"
        }else{
            res += string(s[i]) // 转换成string类型
        }
    }
    return res
}

代码2:

函数

func replaceSpace(s string) string {
    s = strings.Replace(s," ","%20",-1) // 把s中的" "全部替换成"%20"
    return s
}

参考:

代码随想录

题目:151. 反转字符串中的单词

思路:

方法一:在原字符串修改,解题思路如下:

  • 移除多余空格
  • 将整个字符串反转
  • 将每个单词反转

举个例子,源字符串为:"the sky is blue "

  • 移除多余空格 : "the sky is blue"
  • 字符串反转:"eulb si yks eht"
  • 单词反转:"blue is sky the"

方法二:调用库函数

方法三:遍历,找到每个单词然后添加到结果中

代码1:

调用库

func reverseWords(s string) string {
    t := strings.Fields(s) // 分割字符串,无视空格
    l, r := 0, len(t) - 1
    for l < r {
        t[l], t[r] = t[r], t[l] // 交换位置
        l++
        r--
    }
    return strings.Join(t," ") // 添加
}

代码2:

遍历

func reverseWords(s string) string {
    res := "" // 存储答案
    s = " " + s + " " // 前后都加空格统一处理
    lens := len(s)
    l, r := lens -2, lens - 1
    for l >= 0 {
        if s[l+1] == ' ' && s[l] != ' ' { // 确定单词尾部
            r = l + 1
        }
        if s[l+1] != ' ' && s[l] == ' ' { // 确定单词头部并添加
            res += s[l+1:r] + " " // 全都带" "
        }
        l--
    }
    return res[:len(res)-1] // 最后多了一个" "
}

参考:

代码随想录

题目:剑指 Offer 58 - II. 左旋转字符串

思路:

以输入: s = "abcdefg", k = 2为例:

方法一:两个s拼接起来,然后返回中间部分

“abcdefg” + “abcdefg” = “abcdefgabcdefg” 然后再取"ab【cdefgab】cdefg"

方法二:直接分成两部分,然后拼起来:

"【ab】【cdefg】" -> "【cdefg】【ab】"

代码:

func reverseLeftWords(s string, n int) string {
    lens := len(s)
    s = s + s
    return s[n:n+lens] 
    // return s[n:] + s[:n]  直接返回这个
}

参考:

代码随想录

总结

  1. 薄弱点strings库了解不深,之后需要补一下
  2. 之后再用reverse重新做一下下面的几个题

标签:string,part01,随想录,代码,Day07,len,func,res,字符串
From: https://www.cnblogs.com/wtcsky/p/17602099.html

相关文章

  • Java学习Day07
    第六章方法一、方法1.1、概述在我们的日常生活中,方法可以理解为要做某件事情,而采取的解决办法。如:小明同学在路边准备坐车来学校学习。这就面临着一件事情(坐车到学校这件事情)需要解决,解决办法呢?可采用坐公交车或坐出租车的方式来学校,那么,这种解决某件事情的办法,我们就称为方......
  • 代码随想录算法训练营第四十三天| 583. 两个字符串的删除操作 72. 编辑距离
    583.两个字符串的删除操作要求:删除最少的步数,来让这两个字符串相等思路:求末尾的最长公共子序列的长度,然后减去他们的长度代码:1//要求:两个字符串,删除任意一个字符后,让这两个字符相等2//dp[n][m]以n-1结尾的字符串变成节点为m-1为子序列的最大个数3//4//求......
  • 代码随想录算法训练营第四十一天| 1143.最长公共子序列 1035.不相交的线 53. 最大
    1143.最长公共子序列  要求:可以跳过,找出来最长符合的节点难点:如何跳过了之后仍然保留之前的值思路:如果不符,并不是dp[i-1][j-2]等于之前的值,而是dp[i][j]等于它的相关节点以上很重要代码:1//要求:两个子数组,可以删减跳过,找出最长的长度2//思路:dp[n][m]代表第......
  • 初学C语言day07--指针与堆内存
    什么是指针:指针是一种特殊的数据类型,使用它可以定义指针变量,指针变量中存储的是整形数据,该整型数据代表了内存的编号(地址),可以通过这个编号访问对应的内存为什么要使用指针:1、函数之间是相互独立的,但是有时候需要共享变量传参是单向值传递全局变量可以共享,但是容易命名冲突......
  • 代码随想录算法训练营第五天|力扣242.有效的字母异位词、力扣242.两个数组的交集、力
    哈希表哈希表理论基础哈希表,又称为散列表(HashTable),是根据关键码的值而直接进行访问的数据结构其中,数组就是一张哈希表;表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素哈希表解决的问题:一般哈希表都是用来快速判断一个元素是否出现在集合中哈希函数:把学生的......
  • 代码随想录算法训练营第三天| LeetCode 242.有效的字母异位词 349. 两个数组的交集
    242.有效的字母异位词    卡哥建议: 这道题目,大家可以感受到数组用来做哈希表给我们带来的遍历之处。    题目链接/文章讲解/视频讲解: https://programmercarl.com/%E5%93%88%E5%B8%8C%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html   做题思路:......
  • [代码随想录]Day05-哈希表 part01
    题目:242.有效的字母异位词思路:很简单,就是看两个字符串每个字母出现的次数是不是相同的。可以用两个数组来比较,也可以用一个数组比较。代码:一个数组funcisAnagram(sstring,tstring)bool{isExist:=[26]int{}//26个字母for_,ch:=ranges{isE......
  • 代码随想录-哈希表-c++总结
    哈希表内容整体简单,关键是要有利用map映射的思想,以及巩固一些c++标准库的操作这次三数之和一题没有直接做出来,关键在于如何查重一点比较绕15.三数之和-力扣(LeetCode)利用排序+双指针解决三数之和的思路更加清楚此外,四数之和中,四个数相加会溢出int,应改为 ......
  • 代码随想录第四天|力扣24.两两交换链表节点、力扣19.删除链表的倒数第N个结点、力扣面
    两两交换链表中的节点(力扣24.)dummyhead.next=head;cur=dummyhead;while(cur.next!=null&&cur.next.next!=null)temp=cur.next;temp1=cur.next.next.next;cur.next=cur.next.next;cur.next.next=temp;temp.next=temp1;cur=cur.next.next;returndummyhead.n......
  • 代码随想录算法训练营第四天| LeetCode 24. 两两交换链表中的节点 19.删除链表的倒
    24.两两交换链表中的节点     卡哥建议:用虚拟头结点,这样会方便很多。 本题链表操作就比较复杂了,建议大家先看视频,视频里我讲解了注意事项,为什么需要temp保存临时节点。   题目链接/文章讲解/视频讲解:https://programmercarl.com/0024.%E4%B8%A4%E4%B8%A4%E4%BA%......