首页 > 编程语言 >代码随想录算法训练营第7天 | lc344、lc541、卡码54、lc151、卡码55

代码随想录算法训练营第7天 | lc344、lc541、卡码54、lc151、卡码55

时间:2023-12-09 22:25:01浏览次数:48  
标签:卡码 arr slow string fmt 随想录 len lc344

(本合集全部为Go语言实现)

相关文章链接:344题解 541题解 卡码54题解 151题解 卡码55题解
相关视频链接:

Leetcode344

状态:秒了
实现过程中的难点:对撞双指针

个人写法

func reverseString(s []byte)  {
  for i, j := 0, len(s) - 1; i < j; i, j = i + 1, j - 1 {
    s[i], s[j] = s[j], s[i]
  }
}

Leetcode541

状态:秒了
实现过程中的难点:印象比较深刻,这种跨度的题每次循环就直接加一个跨度,而不是自己去计数

个人写法

func reverseStr(s string, k int) string {
  arr := []byte(s)
  for i := 0; i < len(arr); i += 2 * k {
    m, n := i, i + k - 1
    if i + k - 1 >= len(arr) {
      n = len(arr) - 1
    }
    for m < n {
      arr[m], arr[n] = arr[n], arr[m]
      m, n = m + 1, n - 1
    }
  }
  return string(arr)
}

卡码54

状态:基本秒了,go语言的写法卡了一下
实现过程中的难点:基本就是利用各个语言的类似StringBuilder来实现

个人写法

卡码网的Golang版本好像是比较低,没有strings.Builder,但是可以采用低版本的bytes.Buffer平替一下

package main

import (
    "bytes"
    "fmt"
)

func main() {
    var s string
    fmt.Scanln(&s)
    
    var builder bytes.Buffer
    for _, c := range []byte(s) {
        if c >= 'a' && c <= 'z' {
            builder.WriteByte(c)
        } else {
            builder.WriteString("number")
        }
    }
    fmt.Println(builder.String())
}

Leetcode151

状态:比较耗时间
实现过程中的难点:翻转题目可以考虑转换为数组某个段落的翻转。本题我的思路是先将字符串中的单词间空格和首尾空格去除掉,并将每个单词做翻转,再把这部分整体做翻转,即可达成最终的效果

个人写法

func reverseWords(s string) string {
  slow, fast:= -1, 0
  arr := []byte(s)
  var start int
  for fast < len(s) {
    if arr[fast] != ' ' {
      arr[slow + 1] = arr[fast]
      slow++
      if slow > 0 && arr[slow - 1] == ' ' {
        start = slow
      }
      fast++
    } else {
      if slow >= 0 && arr[slow] != ' ' {
        arr[slow + 1] = ' '
        slow++
        for m, n := start, slow - 1; m < n; m, n = m + 1, n - 1 {
          arr[m], arr[n] = arr[n], arr[m]
        }
      } else {
        fast++
      }
    }
  }
  if (arr[slow] == ' ') {
    slow--
  } else {
    for m, n := start, slow; m < n; m, n = m + 1, n - 1 {
      arr[m], arr[n] = arr[n], arr[m]
    }
  }
  for m, n := 0, slow; m < n; m, n = m + 1, n - 1 {
    arr[m], arr[n] = arr[n], arr[m]
  }
  return string(arr[:slow + 1])
}

卡码55

状态:还可以
实现过程中的难点:原地旋转,需要快速想到转换成翻转的思路

个人写法

package main

import (
    "fmt"
)

func main() {
    var k int
    fmt.Scanln(&k)
    var s string
    fmt.Scanln(&s)
    
    arr := []byte(s)
    for i, j := 0, len(arr) - 1; i < j; i, j = i + 1, j - 1 {
        arr[i], arr[j] = arr[j], arr[i]
    }
    
    for i, j := 0, k - 1; i < j; i, j = i + 1, j - 1 {
        arr[i], arr[j] = arr[j], arr[i]
    }
    
    for i, j := k, len(arr) - 1; i < j; i, j = i + 1, j - 1 {
        arr[i], arr[j] = arr[j], arr[i]
    }
    
    
    fmt.Println(string(arr))
}

今日收获

  • 学习到了go的Builder的使用
  • 学到了字符串题目中,翻转是一个思路,可以作为变体题目的一个重要思路

学习时长:2小时左右

标签:卡码,arr,slow,string,fmt,随想录,len,lc344
From: https://www.cnblogs.com/geJoyo/p/17891434.html

相关文章

  • day8、9字符串代码随想录
    第四章字符串●344.反转字符串●541.反转字符串II●卡码网:54.替换数字●151.翻转字符串里的单词●卡码网:55.右旋转字符串1反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组char[]的形式给出。不要给另外的数组分配额外的空间,你必须......
  • 代码随想录算法训练营第七天| 344.反转字符串 541. 反转字符串II
    LeetCode344.反转字符串题目链接: LeetCode344思路: 定义left、right指针,将两指针对应的值反转即可 classSolution{public:voidreverseString(vector<char>&s){intn=s.size();for(intleft=0,right=n-1;left<right;++left,--right){......
  • 代码随想录算法训练营第六天| 454.四数相加 15.三数之和 18.四数之和
    LeetCode454.四数相加题目链接:LeetCode454思路: 将两个数组中的数存放到一个map中,用另外两个数组的值在map中去减 classSolution{public:intfourSumCount(vector<int>&A,vector<int>&B,vector<int>&C,vector<int>&D){unordered_map&l......
  • 代码随想录算法训练营第五天| 242.有效的字母异位词 349. 两个数组的交集 1. 两数之
    LeetCode242.有效的字母异位词题目链接: LeetCode242思路: 使用C++自带的库函数,经过排序后进行比较(使用库函数) classSolution{public:boolisAnagram(strings,stringt){if(s.length()!=t.length())returnfalse;sort(s.begin(),......
  • day5代码随想录
    哈希表理论基础;242.有效的字母异位词349.两个数组的交集202.快乐数1.两数之和来源:代码随想录(programmercarl.com)​6.2哈希冲突-Hello算法(hello-algo.com)1哈希表理论基础又称散列表一般哈希表都是用来快速判断一个元素是否出现集合里。当我们遇到了......
  • 代码随想录算法训练营第5天 | lc242、lc349、lc202、lc1
    (本合集全部为Go语言实现)相关文章链接:242题解349202题解1题解相关视频链接:Leetcode242状态:秒了实现过程中的难点:对于元素固定是小写字母或类似的情况,可以使用数组,因为元素最大数量是固定的个人写法funcisAnagram(sstring,tstring)bool{iflen(s)!=len(t)......
  • 代码随想录算法训练营第4天 | lc24、lc19、lc面试题02.07、lc142
    (本合集全部为Go语言实现)相关文章链接:24题解19题解02.07题解142题解相关视频链接:Leetcode24状态:秒了实现过程中的难点:对组内两个节点的指针指向流转需要倒腾明白。临时头结点真的很有用个人写法funcswapPairs(head*ListNode)*ListNode{tmpHead:=&ListNode{-......
  • 代码随想录算法训练营第3天 | leetcode203、leetcode707、leetcode206
    (本合集全部为Go语言实现)相关文章链接:203题解707题解206题解相关视频链接:Leetcode203状态:秒了实现过程中的难点:链表遍历一定要记得指针后移。另外,在头指针前加入一个新的临时头节点可以统一整个遍历过程,否则需要先确定初始时两指针的状态个人写法/***Definitionfo......
  • 代码随想录算法训练营第四天 | 24. 两两交换链表中的节点 19.删除链表的倒数第N个节
    LeetCode24.两两交换链表中的节点题目链接:LeetCode24思路:交换结点前将cur后第一个结点和第三个结点进行保存,然后修改cur指向头节点后再修改头节点后的结点classSolution{public:ListNode*swapPairs(ListNode*head){ListNode*dummyHead=newListNo......
  • 代码随想录算法训练营第三天 | 203.移除链表元素 707.设计链表 206.反转链表
    LeetCode 203.移除链表元素视频链接:LeetCode203思路:根据链表的性质,将目标值对应的节点保存在一个临时节点中,再重新设置cur下一个节点,再将临时节点进行删除classSolution{public:ListNode*removeElements(ListNode*head,intval){//删除头节点......