首页 > 其他分享 >LeetCode 151. 反转字符串中的单词

LeetCode 151. 反转字符串中的单词

时间:2023-05-10 16:46:29浏览次数:42  
标签:151 空格 string ss 反转 单词 字符串 LeetCode

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

题意:

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

解题思路:

如果我们将整个字符串都反转过来,那么单词的顺序指定是倒序了,只不过单词本身也倒序了,那么再把单词反转一下,单词不就正过来了。
所以解题思路如下:

  1. 移除多余空格
  2. 将整个字符串反转
  3. 将每个单词反转

另外,第二步和第三步的执行顺序是可以互换的,最终的效果是一样的。

完整代码如下(先反转单词,再反转整个字符串):

func reverseWords(s string) string {
    k:=0  //表示去除空格后的数组的下标(因为是原地操作)
    ss:=[]byte(s)
    n:=len(ss)
    ss = append(ss,' ')//长度加 1,
    //因为在循环过程中,每次都在每个单词后面加一个空格,
//如果原字符串s,尾部没有空格,则在添加最后一个空格的时候,会报索引越界的错误。
    for i:=0;i<n;i++{
        if ss[i] != ' '{ 
            // k表示当前新数组的下标,也是一个单词的起始位置
            // t表示一个单词的终止位置
            j, t:= i,k
            for j < n && ss[j] != ' '{ //找到单个单词,起始位置是k,结束位置是 t
                ss[t] = ss[j]
                j++
                t++
            } 
            // reverse(ss[k:t])  //反转k -> t 之间的这个单词
            for a,b:=k,t-1;a<b; a,b = a+1,b-1{
                ss[a],ss[b] = ss[b],ss[a]
            }
            // 在每个单个单词后加一个空格
            ss[t]=' '
            t++
            // 更新下标
            k = t 
            i = j 
        }
    }
    //以上完成了每个单词的反转
    if k > 0{ //k > 0说明至少一个单词,因此要删除最后一个单词后添加的空格
        k--
    }
    // 删除后面多余的部分
    ss = ss[:k]
    // 反转整个链表
    m:=len(ss)
    for i,j:=0,m-1;i<j;i,j=i+1,j-1{
        ss[i],ss[j] = ss[j],ss[i]
    }
    return string(ss)
} 

完整代码如下(先反转整个字符串,再反转单词):

func reverseWords(s string) string {
    ss:=[]byte(s)
    ss = append(ss,' ')
    n:=len(ss)
    for i,j:=0,n-1;i<j;i,j=i+1,j-1{
        ss[i],ss[j] = ss[j],ss[i]
    }
    
    k:=0  //表示去除空格后的数组的下标(因为是原地操作)
    for i:=0;i<n;i++{
        if ss[i] != ' '{ 
            // k表示当前新数组的下标,也是一个单词的起始位置
            // t表示一个单词的终止位置
            j, t:= i,k
            for j < n && ss[j] != ' '{ //找到单个单词
                ss[t] = ss[j]
                j++
                t++
            } 
            //此时单个单词的起始位置是k,终止位置是t,反转单个单词  
            for a,b:=k,t-1;a<b; a,b = a+1,b-1{
                ss[a],ss[b] = ss[b],ss[a]
            }
            // 在每个单个单词后加一个空格
            ss[t]=' '
            t++
            // 更新下标
            k = t 
            i = j 
        }

    }
    //以上完成了每个单词的反转
    if k > 0{ 
        k--
    }
    ss = ss[:k]
    return string(ss)
}

标签:151,空格,string,ss,反转,单词,字符串,LeetCode
From: https://www.cnblogs.com/lxing-go/p/17388403.html

相关文章

  • LeetCode 541. 反转字符串 II
    题目链接:LeetCode541.反转字符串II题意:给定一个字符串s和一个整数k,从字符串开头算起,每计数至2k个字符,就反转这2k字符中的前k个字符。如果剩余字符少于k个,则将剩余字符全部反转。如果剩余字符小于2k但大于或等于k个,则反转前k个字符,其余字符保持原样。......
  • LeetCode 剑指 Offer 05. 替换空格
    题目链接:LeetCode剑指Offer05.替换空格题意:输入一个字符串s,然后将s中的每个空格替换成"%20"。解题思路:直接遍历一遍字符串,如果当前字符不是空格,则加入到结果中如果是空格,则将“%20”加入到结果集完整代码如下:funcreplaceSpace(sstring)string{varres......
  • LeetCode 344. 反转字符串
    题目链接:LeetCode344.反转字符串题意:输入一个字符串,将其在原地进行反转。解题思路:对于字符串,我们定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。完整代码如下:funcreverseString(s[]byte){//原地反转字符......
  • leetcode bash题--统计词频
    写一个bash脚本以统计一个文本文件words.txt中每个单词出现的频率。为了简单起见,你可以假设:words.txt只包括小写字母和''。每个单词只由小写字母组成。单词间由一个或多个空格字符分隔。示例:假设words.txt内容如下:thedayissunnythethethesunnyisis你的脚......
  • LeetCode刷题记录|LeetCode热题100|136.只出现一次的数字(easy)
    题目描述:给你一个非空整数数组nums,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。时间复杂度:O(n),其中n是数组长度。只需要对数组遍历一次。空间复......
  • leetcode 626 換座位
    leetcode626換座位SELECT(CASEWHENMOD(id,2)!=0ANDcounts!=idTHENid+1WHENMOD(id,2)!=0ANDcounts=idTHENidELSEid-1END)ASid,studentFROMseat,(SELECTCOUNT(*)AScountsFRO......
  • leetcode 619 只出現一次的最大數字
    leetcode619只出現一次的最大數字 selectmax(num)asnumfrom(selectnumasnumfromMyNumbersgroupbynumhavingcount(num)=1)asmn selectif(count(num)=1,num,null)asnumfromMyNumbersgroupbynumorderbynumdesclimit0,......
  • leetcode 1679
    1.排序双指针先排序sort(nums.begin(),nums.end());在双指针查找while(left<right){if(nums[left]+nums[right]<k){left++;}elseif(nums[left]+nums[right]>k){right--;}else{left++;right--;count++;}}2.......
  • leetcode-349. 两个数组的交集
    returnnums1.Intersect(nums2);题意:给定两个数组,编写一个函数来计算它们的交集。c#可以用linq自带的方法返回,顺便看了下微软的内部实现:privatestaticIEnumerable<TSource>IntersectIterator<TSource>(IEnumerable<TSource>first,IEnumerable<TSource>second,IEquali......
  • #yyds干货盘点# LeetCode面试题:不同的二叉搜索树 II
    1.简述:给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。 示例1:输入:n=3输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]示例2:输入:n=1输出:[[1]]2.代......