leetcode-541-Reverse String II

题目描述:

Given a string and an integer k, you need to reverse the first k characters for every 2k characters counting from the start of the string. If there are less than k characters left, reverse all of them. If there are less than 2k but greater than or equal to k characters, then reverse the first k characters and left the other as original.

Example:

Input: s = "abcdefg", k = 2
Output: "bacdfeg"

Restrictions:

  1. The string consists of lower English letters only.
  2. Length of the given string and k will in the range [1, 10000]

要完成的函数:

string reverseStr(string s, int k)

说明:

1、这道题目看懂题意之后很容易做。给定一个字符串s和一个数字k,反转字符串前2k位中的k位。比如abcdefg,k=2,也就是反转前4位abcd中的前两位ab,反转结果为bacd。

当我们处理到字符串末尾的时候,不一定都能找到刚好有2k位的。所以这个时候如果有小于2k位但是大于等于k位的,反转前面k位,后面不用变化。如果小于k位,那么反转剩下的所有字母。

2、我们把上述条件转化一下,构造如下代码(附解释):

    string reverseStr(string s, int k) 
    {
        int i=0,s1=s.size(),j,t1;//i用来记录起始位置
        char t;//反转过程中的临时变量
        while(i<s1)
        {
            if(i+2*k-1<s1)//正常情况
            {
                t1=i+2*k;//记录处理完2k个字母之后下一个字母的位置
                j=i+k-1;//要处理k个字母,j记录末尾位置
                while(i<j)//反转
                {
                    t=s[i];
                    s[i]=s[j];
                    s[j]=t;
                    i++;
                    j--;
                }
                i=t1;//i更新到下一个要处理的字母位置
            }
            else if(i+2*k-1>=s1&&i+k-1<s1)//特殊情况,<2k&&>=k
            {
                j=i+k-1;
                while(i<j)
                {
                    t=s[i];
                    s[i]=s[j];
                    s[j]=t;
                    i++;
                    j--;
                }
                return s;//处理完这个特殊条件,必定结束了整个字符串的处理
            }
            else if(i+k-1>=s1)//特殊情况,<k
            {
                j=s1-1;
                while(i<j)
                {
                    t=s[i];
                    s[i]=s[j];
                    s[j]=t;
                    i++;
                    j--;
                }
                return s;
            }       
        }
        return s;//如果字符串为“abcd”,k=2,刚好只用到了正常情况
        
    }

上述代码实测9ms,beats 96.34% of cpp submissions。 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CVer

Python Numpy学习教程(一)Python篇

通知:这篇文章主要简单介绍Python的基本数据结构、容器、列表、字典、集合、元组、函数和类等知识点 Python Numpy学习教程 Author: ...

1K140
来自专栏CodingToDie

Python学习(五):函数

第5 章 函数 Table of Contents 函数调用 数据类型转换 定义函数 空函数 返回多个值 tuple 函数调用 Python内置了很多有用的函数...

46350
来自专栏向治洪

Kotlin基础之泛型

泛型 与Java一样,Koltin的类也有类型参数。例如: class Box<T>(t: T){ var value = t } 常规来说,创建这样的...

19970
来自专栏james大数据架构

程序猿都没对象,JS竟然有对象?

  现在做项目基本是套用框架,不论是网上的前端还是后端框架,也会寻找一些封装好的插件拿来即用,但还是希望拿来时最好自己过后再回过头了解里面的原理,学习里面优秀的...

23060
来自专栏腾讯Bugly的专栏

Swift 对象内存模型探究(一)

HandyJSON 是 Swift 处理 JSON 数据的开源库之一,类似 JOSNModel,它可以直接将 JSON 数据转化为类实例在代码中使用。 由于 S...

55170
来自专栏Golang语言社区

[Go语言]从Docker源码学习Go——指针和Structs - lemon_bar

http://www.cnblogs.com/lemonbar/p/3932981.html 主题 Go语言 Docker function和method关...

38440
来自专栏别先生

JAVA编程中的类和对象

1:初学JAVA,都知道JAVA是面向对象的编程。笔者这节开始说说类和对象。(实例仅供参考,如若复制粘贴记得修改包名和类名,避免出错) 学习JAVA的快捷键,A...

203100
来自专栏应兆康的专栏

12步轻松搞定Python装饰器

Python里面的装饰器比较复杂,下面12步可以帮你你较好的理解Python中的装饰器 1. 函数 在python中,函数通过 def关键字、函数名和可选的参数...

349100
来自专栏阿凯的Excel

Python读书笔记6(列表-基本特性)

前期和大家分享了数字和字符串,如果数字和字符串都是单一的个体的话,列表就是将多个数字和字符串组合在一起,形成列表。列表概念与数组概念类似,是包含任意对象的有序集...

29950
来自专栏夏时

PHP 特色:可变变量

14440

扫码关注云+社区

领取腾讯云代金券