leetcode题344,java解反转字符串beat100%

48 篇文章 0 订阅
8 篇文章 0 订阅

大家好呀,我是善于思考的编程麒,大家可以叫我麒麒,也可以叫我xin麒呀。

今天分享的这道leetcode是实在是太简单了,对了xin麒也是学生,今天下午四点刚刚下课就去图书馆开始刷题,今天要分享的这道题直接是秒解,xin麒今天太开心了。

下面我们来看看吧。

一、问题描述:

反转字符串

CategoryDifficultyLikesDislikes
algorithmsEasy (78.10%)551-
Tags

two-pointers | string

Companies

Unknown

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须**原地修改输入数组**、使用 O(1) 的额外空间解决这一问题。

示例 1:

输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]

示例 2:

输入:s = ["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]

提示:

  • 1 <= s.length <= 105
  • s[i] 都是 ASCII 码表中的可打印字符

Discussion | Solution

二、思路:

前提引入:

  • 定义一个变量end来作为指向数组的末尾元素的指针;
  • 题解使用的是普通for循环,其中i作为字符数组的左指针;
  • 当反转完成就退出for循环。(循环退出判断条件由此而来)

思路分析:

​ 首先看到该题时,xin麒一开始就想到是对字符数组的两头调换位置。出于处于严谨性,xin麒考虑到如果数组长度是奇数和偶数会不会有影响呢?于是xin麒分析了一下:

  • 假如s.length为偶数,那么在s数组的头和尾不断的交换位置时,最后的一个状态便是i的数值仅仅比end大1;也就是说i一直向右走,end一直向左走,最后end指针会走到i指针左边,此时end < i
  • 假如s.length为奇数,那么最后一次移动时,s[i]s[end]中间必定会存在一个元素,i指针向向右移动一步,end指针向左移动一步,刚好此时end等于i
  • 于是xin麒就知道了当遍历在持续时,i和end只有在end <= i时才可以终止循环。

过程:

  • 先定义一个end指针,end在循环里不断递减;
  • for循环里,i作为指针;
  • 每一次循环如果满足end <= i,那么就可以退出循环。(直接end<i也可以,不过就是在s.lenght为奇数情况下多交换一步,交换的是最中间的那个元素,相当于白交换了,影响也不大)
  • 如果不满足end <= i那么交换索引end和索引i所对应的元素的字符。

三、题解:

class Solution {
    public void reverseString(char[] s) {
        int end = s.length - 1;
        for (int i = 0; i < s.length; i++) {
            if (end < i ){break;}//if (end <= i ){break;}也可以
            char ch = s[i];
            s[i] = s[end];
            s[end--] = ch;
        }
    }
}
运行:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值