首页 > 其他分享 >翻转字符串里的单词(双指针去重思路+代码实现)

翻转字符串里的单词(双指针去重思路+代码实现)

时间:2024-07-25 13:01:05浏览次数:6  
标签:空格 slow end ++ fast 单词 isblock 翻转 指针

题目

在这里插入图片描述

①双指针思路

整体思路:去重+反转

数组填充类问题都可以使用双指针方式!
原理如同:双指针移除元素

去重其实是一种删除操作,

1.双指针去重

fast判断
slow指向待填充位置

额外再使用一个变量:isblock(判断之前是否出现过空格)
连续空格的话只保留一个空格,达到去重效果
遇到非空格,将isblock设置为false,表示空格不再连续

2.多次反转

多次反转达到调整顺序的目的。用法同:多次反转 -> 右旋字符串

②代码实现

class Solution {
public:
    string reverseWords(string& s)
    {
    	 if(s.size()==1)return s;
    	 deleteRepete(s);//删除多余空格
    	 reverseW(s);//反转单词
    	 return s;
    }
    
    //空格去重操作
	void deleteRepete(string& s){
		bool isblock = true;//头部的空格是要删除的(头部空格的话,没有后面也会置为false)
		
		//双指针法去除空格 
		int slow = 0;//待填充的位置 
		int fast = 0;//遍历对比,选择slow填充的形式 
		while(fast<s.size()){//分支语句的代码是可以优化的,但是优化完逻辑不清晰,所以就不优化了!
			if(isblock){//之前空白
				if(s[fast]!=' '){//空白+没有遇到空白 
					isblock=false;//空白不连续了
					s[slow]=s[fast];
					slow++;
					fast++;
				}
				else{//空白+空白//跳过 -> 去重操作 
					fast++;
				}
			}
			
			else{//之前没空白,可以填充,但要标记 
				if(s[fast]==' '){
					isblock=true;
				}
				
				s[slow]=s[fast];
				slow++;
				fast++;
			}
		}
		
		//去除尾部(可用三元运算符优化)
		if(s[slow-1]==' '){
			s = s.substr(0,slow-1);
		}
		else{
			s = s.substr(0,slow);
		}
	}
	
    //反转单词
    void reverseW(string& s){
    	reverse(s.begin(),s.end());
    	
    	int start=0;
    	int end =0;
		
		while(end<=s.size())
		{
			if(end==s.size()||s[end]==' '){
				reverse(s.begin()+start,s.begin()+end);
				start = end+1;
			}
			end++;
		}
		
	}
    
};

③优化

换一种思路可以优化代码。
思路:代码随想录

去重所有的空格,而在需要保留空格的地方,主动填充一个空格(需要保留空格的地方也删除过空格,只是后来填充回来)

标签:空格,slow,end,++,fast,单词,isblock,翻转,指针
From: https://blog.csdn.net/kchick/article/details/140686668

相关文章

  • 力扣:三数之和(左右双指针思路+动画演示+代码实现)
    题目①双指针思路(双指针匹配方式,还不涉及去重)1.需要的变量个数(三个变量,双指针作为其中两个)left、right已经两个变量,表示两个数。题目求三数之和,只需要另外一个变量i即可!所以一共是nums[i]、nums[left]、nums[right]。存储满足条件的这三个值2.双指针工作原理......
  • P3294 [SCOI2016] 背单词 题解
    题意给你\(n\)个字符串,让你对其进行排列,使得按以下规则花费最少:设当前字符串为\(s\),\(x\)为\(s\)在答案排列中的位置。如果\(s\)存在后缀且\(s\)的后缀在\(s\)之后,花费加\(n^2\)。如果\(s\)不存在后缀则花费加\(x\)。设\(y\)为\(s\)之前离其最近的......
  • C语言:指针1(详细讲解)
     目录指针变量和地址取地址操作符指针变量的大小指针变量类型意义指针解引⽤指针的+-整数const修饰指针const修饰变量const修饰指针变量指针的运算指针+-整数 指针的关系运算野指针指针未初始化 指针越界访问指针指向的空间被释放了避免野指针assert......
  • c++11(3): 类型推导与智能指针
    41.两个右尖括号>在模板中不再被判定为右移,需要右移需要加圆括号()42.auto类型推导,编译时推导inta=1;autob=a;//b的类型为int1):auto不能作函数形参类型2):auto不能对结构体中的肥静态成员进行推导3):auto不能声明数组4):auto不能在实例化模板时作为......
  • C语言 ——— 函数指针数组的讲解及其用法
    目录前言函数指针数组的定义函数指针数组的使用前言数组是存放一组相同类型数据的存储空间关于指针数组的知识请见:C语言———指针数组&指针数组模拟二维整型数组-CSDN博客那么要将多个函数的地址存储到数组中,这个数组该如何定义呢?函数指针数组的定义把多个函数......
  • 深入理解指针(2)
    一、数组名的理解首先我们先做一个测试:#include"stdio.h"intmain(){ intarr[10]={1,2,3,4,5,6,7,8,9,10}; printf("&arr[0]=%p\n",&arr[0]); printf("arr=%p\n",arr); return0;}输出结果:我们发现数组名和数组首元素的地址打印出的结果一模一样,数组名......
  • 深入理解指针(3)
    一、字符指针变量字符指针变量一般用char*来表示一般使用:#include"stdio.h"intmain(){charch='w';char*pc=&ch;*pc='w';return0;}还有一种使用方法:#include"stdio.h"intmain(){constchar*pc="hellobit......
  • C++this指针--指针的介绍用法以及相关注意事项
    什么是this指针this指针是在C++中用来指向当前对象的特殊指针。它是每个非静态成员函数的隐式参数,指向调用该函数的对象。在C++类的成员函数中,除了静态成员函数外,每个成员函数都有一个隐含的this指针,它指向调用该函数的对象。这个指针可以让成员函数访问调用它的对象......
  • LeetCode226. 翻转二叉树
    LeetCode题目链接:https://leetcode.cn/problems/invert-binary-tree/题目叙述:给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[]思路这道......
  • 代码随想录算法训练营第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.完全平......