【剑指offer】面试题58 - II:左旋转字符串(Java)
检查边界条件:如果n等于0或等于字符串长度,直接返回原字符串。 计算实际旋转次数:由于字符串左旋转n次的效果与左旋转n mod L次相同(L是字符串长度),所以可以先计算n mod L,避免重复旋转。 使用字符数组:将字符串转换为字符数组,可以更高效地操作字符串的字符。 预先分割字符数组:将字符数组分割为两部分,前n个字符和后面的字符。 连接字符数组:将两部分字符数组连接起来,形成最终的旋转后的字符串。 检查边界条件:首先检查n是否在有效范围内。如果n小于等于0或大于等于字符串长度,直接返回原字符串。 计算实际旋转次数:使用取模运算,计算实际需要旋转的次数,避免重复旋转。 转换为字符数组:将字符串转换为字符数组,可以更高效地操作字符串的字符。 分割字符数组:将字符数组分割为两部分,前n个字符和后面的字符。 连接字符数组:使用StringBuilder高效地连接两部分字符数组,形成最终的旋转后的字符串。
发布日期:2021-04-30 21:03:16
浏览次数:105
分类:精选文章
本文共 1722 字,大约阅读时间需要 5 分钟。
字符串左旋转操作的实现
在编程中,字符串操作是一个常见的任务。今天,我们来探讨如何实现字符串的左旋转操作。左旋转操作的定义是将字符串的前若干个字符移动到字符串的末尾。例如,输入字符串"abcdefg"和数字2,输出应该是"cdefgab"。
首先,我们需要理解左旋转操作的实现逻辑。假设字符串长度为L,旋转的次数为n,那么左旋转n次的效果等同于将前n个字符移动到字符串末尾。例如,字符串"abcdefg",左旋转2次后得到"cdefgab"。如果n大于字符串的长度,或者小于等于0,直接返回原字符串。
接下来,我们来看如何实现这一操作。在Java中,可以通过字符串的substring方法来实现。具体来说,可以将字符串分割为两部分:前n个字符和后面的字符,然后将两部分连接起来。例如,字符串s = "abcdefg",n = 2,那么x = s.substring(0, 2) = "ab",剩余部分s = s.substring(2, 7) = "cdefg"。最终的结果就是s + x = "cdefgab"。
但是,需要注意的是,频繁使用substring方法可能会对性能产生影响。为了提高效率,可以考虑将字符串预先转换为字符数组,并使用更高效的方法进行操作。
优化思路
为了优化字符串左旋转操作,可以考虑以下步骤:
优化代码
基于上述思路,我们可以编写一个高效的字符串左旋转函数:
public String reverseLeftWords(String s, int n) { // 如果n不在有效范围内,直接返回原字符串 if (n <= 0 || n >= s.length()) { return s; } // 计算实际需要旋转的次数 int effectiveRotation = n % s.length(); // 将字符串转换为字符数组 char[] chars = s.toCharArray(); // 分割字符数组 int splitIndex = effectiveRotation; char[] firstPart = new char[splitIndex]; System.arraycopy(chars, 0, firstPart, 0, splitIndex); char[] secondPart = new char[s.length() - splitIndex]; System.arraycopy(chars, splitIndex, secondPart, 0, s.length() - splitIndex); // 重新组合字符串 StringBuilder sb = new StringBuilder(); sb.append(secondPart); sb.append(firstPart); return sb.toString();} 代码解释
这种方法不仅提高了效率,还避免了不必要的重复操作,能够在处理较大的字符串时表现更好。
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2026年06月05日 03时28分54秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!