栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

leetcode541. 反转字符串 II

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

leetcode541. 反转字符串 II

题目:541. 反转字符串 II 思路 本人想法:通过计数器,计数到2k时,翻转前k个,剩余的最后翻转。不过这种思路没有通过要求的全部案例,只能AC一部分案例。 学习正确做法

将翻转情况分为2种情况第一种:剩余字符数大于等于k个,则翻转前k个;第二种:剩余字符数小于k个,则全部翻转。

class Solution {
	public String reverseStr(String s, int k) {
		char[] ch = s.toCharArray();
		int start = -1;
		int end = -1;
		for (int i = 0; i < ch.length; i += 2 * k) {
			start = i;
			// 确定翻转区间,左闭右闭[start, end]
			// if (start + k <= ch.length) {
			// // 剩余字符数大于等于k
			// end = start + k - 1;
			// } else {
			// // 剩余字符数小于k
			// end = ch.length - 1;
			// }
			end = Math.min(start + k, ch.length) - 1;

			// 反转逻辑
			while (start < end) {
				char tmp = ch[start];
				ch[start++] = ch[end];
				ch[end--] = tmp;
			}
		}
		return new String(ch);
	}
}

另一种写法

public class Solution02 {
	public String reverseStr(String s, int k) {
		char[] ch = s.toCharArray();
		// 每次走2k步,分2种情况进行反转
		for (int i = 0; i < ch.length; i += 2 * k) {
			// 剩余字符数大于或等于k,反转前k个
			if (i + k <= ch.length) {
				reverse(ch, i, i + k - 1);
				continue; // 没有走到数组结束,继续
			}
			// 剩余字符数小于k个,全部反转
			reverse(ch, i, ch.length - 1);
		}
		return new String(ch);
	}

	private void reverse(char[] ch, int start, int end) {
		while (start < end) {
			char tmp = ch[start];
			ch[start++] = ch[end];
			ch[end--] = tmp;
		}
	}
}

总结

Java中String为不可变类型,因此可以将String的数据存储到可变的数据类型中;方法1:采用String的toCharArray()方法转为char[];方法2:采用可变的StringBuilder或者StringBuffer;单线程使用StringBuilder效率高。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/769413.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号