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

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

时间:2024-06-04 13:34:24浏览次数:20  
标签:151 char right ++ 单词 start while Leetcode left


此题是非常经典的字符串的颠倒问题,但这个更复杂一些,但也不其本质,我此次写的方式是用双指针问题完成的,虽然算不上什么好方法,但如果各位看官觉得满意的话,请各位给我个点个免费的赞吧,谢谢了_

1.题目要求如图所示:
在这里插入图片描述
2.接下来是做题的步骤:

我们先把字符串的颠倒函数写好,如图所示:

void reverse(char* left,char* right)
{
    while(left <= right)
    {
        char str = *left;
        *left = *right;
        *right = str;
        left++;
        right--;
    }
}

(1).我们先把整个字符串都颠倒过来,如图所示:

char* left = s;
    char* right = s + strlen(s) - 1;
    //先进行字符串逆置
    reverse(left,right);

(2).然后再让各个单词颠倒过来,如图所示:

char* start = s;
    while(*start != '\0')
    {
        while(*start == ' '&&*start != '\0')
        {
            start++;
        }
        char* end = start;
        while(*end != ' '&&*end != '\0')
        {
            end++;
        }
        reverse(start,end-1);
        if(*end != '\0')
        {
            end++;
        }
        start = end;
    }

(3)此时各个单词颠倒过来后,我们就先把字符串首尾的括号去掉,我是用malloc函数辅助我这一想法的_,如图所示:

left = s;
    right = s + strlen(s) - 1;
    //头尾括号
    while (*left == ' ')
        left++;
    while(*right == ' ')
        right--;
    char* string = (char*)malloc(sizeof(char) * (strlen(s) + 1));
    int j = 0;
    while(left <= right&&*left != '\0')
    {
        *(string + j) = *left;
        j++;
        left++;
    }
    *(string + j) = '\0';

(4).然后我们再去掉单词之间的括号,如图所示:

int s_size = 0;
    int i = 0;
    while(i < j)
    {
        if(string[i] == ' '&&string[i] != '\0')
        {
            s[s_size] = string[i];
            s_size++;
            i++;
            if(i >= j)
            break;
            while(string[i] == ' ')
            {
                i++;
                if(i >= j)
                break;
            }
        }else{
            s[s_size] = string[i];
            s_size++;
            i++;
            if(i >= j)
            break;
        }
    }
    s[s_size] = '\0';

(5).全部代码如下图所示:

//字符串逆置函数
void reverse(char* left,char* right)
{
    while(left <= right)
    {
        char str = *left;
        *left = *right;
        *right = str;
        left++;
        right--;
    }
}
char* reverseWords(char* s) {
    char* ret = s;
    char* left = s;
    char* right = s + strlen(s) - 1;
    //先进行字符串逆置
    reverse(left,right);
    //然后再让单词进行逆置
    char* start = s;
    while(*start != '\0')
    {
        while(*start == ' '&&*start != '\0')
        {
            start++;
        }
        char* end = start;
        while(*end != ' '&&*end != '\0')
        {
            end++;
        }
        reverse(start,end-1);
        if(*end != '\0')
        {
            end++;
        }
        start = end;
    }
    left = s;
    right = s + strlen(s) - 1;
    //去掉头尾括号
    while (*left == ' ')
        left++;
    while(*right == ' ')
        right--;
    char* string = (char*)malloc(sizeof(char) * (strlen(s) + 1));
    int j = 0;
    while(left <= right&&*left != '\0')
    {
        *(string + j) = *left;
        j++;
        left++;
    }
    *(string + j) = '\0';
    //去掉单词之间的括号
    int s_size = 0;
    int i = 0;
    while(i < j)
    {
        if(string[i] == ' '&&string[i] != '\0')
        {
            s[s_size] = string[i];
            s_size++;
            i++;
            if(i >= j)
            break;
            while(string[i] == ' ')
            {
                i++;
                if(i >= j)
                break;
            }
        }else{
            s[s_size] = string[i];
            s_size++;
            i++;
            if(i >= j)
            break;
        }
    }
    s[s_size] = '\0';
    return ret;
}

好了,各位看官,这就是我的代码,各位看官如果觉得满意的话就给个免费的赞吧,谢谢各位了。

标签:151,char,right,++,单词,start,while,Leetcode,left
From: https://blog.csdn.net/m0_54244065/article/details/139440030

相关文章

  • 基于SpringBoot的英语单词小程序的设计与实现(期末大作业)+附源码+数据库
    摘要随着经济的不断发展与进步,语言的全球化慢慢的变成现今世纪非常重要的一种发展趋势。本文针对大学生在校阶段开发了一个基于SpringBoot的英语等级助考系统,通过线上小程序学习的方式,减少学生学习时间、降低学生学习压力、增强学习效果。该系统采用微信开发工具和基于SpringB......
  • Leetcode 313. Super Ugly Number
    ProblemAsuperuglynumberisapositiveintegerwhoseprimefactorsareinthearrayprimes.Givenanintegernandanarrayofintegersprimes,returnthenthsuperuglynumber.Thenthsuperuglynumberisguaranteedtofitina32-bitsignedintege......
  • LeetCode 1748. Sum of Unique Elements
    原题链接在这里:https://leetcode.com/problems/sum-of-unique-elements/description/题目:Youaregivenanintegerarray nums.Theuniqueelementsofanarrayaretheelementsthatappear exactlyonce inthearray.Return the sum ofalltheuniqueelementso......
  • (nice!!!)LeetCode 3097. 或值至少为 K 的最短子数组 II(位运算、滑动窗口)
    3097.或值至少为K的最短子数组II思路:既然求的是区间,那么我们自然就想到前缀和、滑动窗口、双指针。结合本题的特点:或运算,会发现如果一段连续的区间进行或运算,最多只会有32次运算可以改变,这是因为int型的二进制范围是-2^31~2^31-1,每次增加一个二进制形式的1。所......
  • (nice!!!)LeetCode 3067. 在带权树网络中统计可连接服务器对数目(深度优先搜索dfs、树)
    3067.在带权树网络中统计可连接服务器对数目思路:节点数最多1000,那么我们0(n^2)的时间复杂度就ok了。我们可以用一层for循环遍历每一个点i,然后第二层for循环遍历每一条可能的边j,通过用dfs来找到符合“到根节点i的距离可以被signalSpeed整除”的点。不同子节点之间两两组......
  • 常用单词
    常用单词英文中文customadj.定做(制)的Provider供应商Infrastructures基础设施(复数)Solution解决方案Handler处理程序Balancer均衡器Discover发现Registrar注册者Resolver解析器Consumer消费者Producer生产者Publisher......
  • [leetcode 3171] 解法列表
    线段树解法+二分classSolution{publicintminimumDifference(int[]nums,intk){this.nums=nums;this.n=nums.length;returncheck(k);}publicstaticvoidmain(String[]args){Solutionsolution=newSol......
  • leetcode 377. 组合总和 Ⅳ(dp)
    377.组合总和Ⅳ-力扣(LeetCode)dp,跟完全背包反着来,可以当作是爬楼梯来做,相当于每次爬的楼梯数是从数组种选的。1#defineIOstd::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)2#definebug(x)cout<<#x<<"is"<<x<<endl;3#include<bits/stdc++.h>4usin......
  • Floyd判圈算法 leetcode
    龟兔赛跑/Floyd判圈算法概述判断一个链表是否存在环画图演示两个指针相遇的情况:查找链表中环的首个节点在这里插入图片描述数学公式表示为:(对应力扣142.环形链表II,141.环形链表I)判断一个链表是否存在环龟兔赛跑/Floyd判圈算法转换成判断链表是否存......
  • LeetCode 1168. Optimize Water Distribution in a Village
    原题链接在这里:https://leetcode.com/problems/optimize-water-distribution-in-a-village/description/题目:Thereare n housesinavillage.Wewanttosupplywaterforallthehousesbybuildingwellsandlayingpipes.Foreachhouse i,wecaneitherbuildaw......