面试题目:
I lover your name 变成: name your lover I
我的做法:(我是考虑到传递的分割串可能为多个字符)
package com.data;
/**
* 字符串反转 源字符串:I lover your name 反转后:name your lover I
*
* 思路:从name 的e开始检索lenth长度为sep的字符串,比较和sep是否一致
* @author xinchun.wang
*
*/
public class ReverseString {
/**
* 字符串反转
* @param srcString 源字符串
* @param sep 分隔符
* @return 反转后的字符串
*/
public static String reverse(String srcString, String sep) {
StringBuilder returnBuilder = new StringBuilder();
int length = sep.length(); // 分隔串的长度
int begin = 0; // targetString 的结束位置
int end = srcString.length();// targetString 的开始位置
for (int i = srcString.length(); i >= 0;) {
begin = i;
if (i - length <= 0) { //如果i -length <= 0,那么可以认定可以直接拼接返回结果了
returnBuilder.append(srcString.substring(0, end));
return returnBuilder.toString();
}
String tempSep = srcString.substring(i - length, i); //获取可能的分隔串
if (!tempSep.equals(sep)) { //如果不和分割串一致,那么从i-1的位置继续检索
i = i - 1;
continue;
}
String target = srcString.substring(begin, end);
returnBuilder.append(target).append(" ");
end = i - length;
i = i - length;
}
return returnBuilder.toString();
}
public static void main(String[] args) {
String result = reverse("I lover your name", " ");
System.out.println(result);
}
}
更好的做法:
无需申请占用更多的空间,效率也较高,复杂度增加!!
这个算法可以兼容各自分隔符,任何分隔串都是可以的
package com.data;
/**
* 字符串反转 源字符串:I lover your name 反转后:name your lover I
*
* 思路:从name 的e开始检索lenth长度为sep的字符串,比较和sep是否一致
*
* @author xinchun.wang
*
*/
public class ReverseString2 {
/**
* 字符串反转
* @param srcString 源字符串
* @param sep 分隔符
* @return 反转后的字符串
*/
public static void reverse(char[] data, int begin, int end, String sep) {
for (int i = begin; i < (begin+(end-begin+1)/2); i++) {
char temp = data[i];
data[i] = data[(end - i)+begin];
data[(end - i)+begin] = temp;
}
if (sep == null) {
return;
}
int sepLength = sep.length();
int tempBegin = begin;
int tempEnd = end;
for (int i = begin; i <= end; i++) {
int index = 0;
boolean flag = true; // 标识是否匹配
for (int j = i; j <= end && index < sepLength; j++,index++) {
if (data[j] == sep.charAt(index)) {
flag = true;
if (index == sepLength - 1) {
break;
}
} else {
flag = false;
break;
}
}
if (flag) { //如果完全匹配了,那么
tempEnd = i-1;
reverse(data, tempBegin, tempEnd, null);
tempBegin = i + sepLength;
}
if (i == end) {
tempEnd = i;
reverse(data, tempBegin, tempEnd, null);
}
}
}
public static void main(String[] args) {
char[] data = "abc def 123 7879 45".toCharArray();
reverse(data, 0, data.length - 1, " ");
System.out.println(new String(data));
}
}
分享到:
相关推荐
首先,字符串反转是编程中常见的问题,常常用于各类笔试和面试中。而字符串逆序则是在反转的基础上,进一步处理,让整个字符串的顺序完全颠倒。 在本知识点中,将详细介绍以下内容: 1. 字符串反转的原理和方法 2. ...
字符串反转可以是从后向前遍历并构建新的字符串,而单词反转则需要在保持单词边界的同时进行。 下面是一种常见的Python实现方法: ```python def reverse_string_by_word(s): # 使用split()函数将字符串s按空格...
C语言中的字符串处理是编程面试中的常见主题,尤其是在嵌入式系统或底层开发相关的面试中。下面我们将深入探讨一些基于`string.h`库的常用字符串函数,并提供一些问题的解决方案。 1. **字符串函数** - `strlen`: ...
同时,它也测试了问题解决能力和算法设计,如何有效地反转单词顺序而不改变单词内字符的顺序。 在准备面试时,这样的题目可以帮助应聘者提高对字符串处理的理解,并锻炼他们在实际编程场景中解决问题的能力。对于...
在本压缩包中,我们关注的是一个Python编程与算法相关的面试题目——LeetCode的第186题,题目名为“反转字符串中的单词II”。这道题主要考察的是字符串操作和数组处理技巧,对于Python程序员来说,是提升技能和准备...
本面试题的核心是使用双指针技巧来反转字符串中的单词,这是一个常见的编程挑战,旨在考察候选人的逻辑思维和对C语言基础知识的掌握程度。 首先,我们需要理解题目要求。反转字符串中的单词意味着保持每个单词的...
4. 最后,将整个字符串反转回来,这样可以确保单词顺序不变,但单词内部的字符顺序已反转。 通过分析和理解这个问题,不仅可以锻炼Java编程能力,还能提高对字符串操作和算法的理解,这对于任何Java开发者,尤其是...
本资料包“java-leetcode面试题解双指针之第151题反转字符串中的单词.zip”主要探讨了LeetCode第151题,即如何使用双指针技巧来反转字符串中的单词。 首先,我们来看第151题的具体描述。这道题目要求我们反转给定的...
在处理字符串时,我们需要特别注意这个结束标志,确保不超出数组边界。 2. **双指针技巧**:题目中采用了双指针技巧来实现字符串的反转。`Reverse`函数通过两个指针`pBegin`和`pEnd`,分别从字符串的头部和尾部开始...
在Java编程中,有时我们需要对字符串进行特定维度的反转操作,比如题目中提到的“以单词的维度反转字符串”。这通常涉及到字符串处理和数据结构的运用。本问题是一道典型的面试题,旨在考察测试工程师对字符串操作的...
在本压缩包中,我们关注的是一个Python编程相关的LeetCode面试题目——第345题,即“反转字符串中的元音字母”。这是一道涉及到字符串处理和算法的题目,主要考察程序员对字符串操作的熟悉程度以及对问题解决的逻辑...
然后,我们可以简单地反转单词列表,最后用`join()`方法将单词重新组合为字符串。 **复杂度分析:** - 时间复杂度:O(N),总体为线性时间复杂度,各函数的时间复杂度如下: - `split()`方法:O(N) - `strip()`...
- 反转思想:将字符串分为两部分 X 和 Y,先反转 X 再反转 Y,最后整体反转一次即可。 - 例如 "abcdef" 要求 "cdefab",步骤如下: 1. 反转 "abc" 得到 "cba"; 2. 反转 "def" 得到 "fed"; 3. 整体反转 ...
3. **反转字符串**:另一种策略是先反转整个字符串,这样第一个单词就会变为最后一个单词,然后我们只需要找到第一个空格的位置即可。 4. **分词操作**:通过`split()`方法,我们可以得到单词列表。如果原字符串为...
lru缓存leetcode 代码锈 使用 coderust 破解编码面试 总结 大批 链表 数学与统计 字符串 树木 堆栈和队列 图表 ...反转单向链表 ...反转偶数节点 ...反转 ...置换字符串 ...字符串 倒置句子中的单词 ...字符串分割
本文基于《代码随想录》,围绕着字符串相关的知识点深入探讨,详细解析了一系列经典的字符串操作问题及其对应的解题思路与代码实现,覆盖字符串反转、替换空格、单词翻转及KMP模式匹配等多个重点主题。此外,还阐述...
对于应聘者来说,掌握字符串相关的算法和技巧是必不可少的能力之一。微软作为全球知名的科技公司,在其面试过程中常常会考察应聘者的逻辑思维能力和对基本数据结构的理解程度。 题目描述:本题要求实现的功能是...
25. reverseString:反转字符串。 26. pluralize:根据输入的数字返回单词的单数或复数形式,并使用可选的字典(如果提供)。 27. prettyBytes:将以字节为单位的数字转换为人类可读的字符串。 28. sample:从数组中...
- 英文单词首字母大写并逐个反转:涉及到字符串处理和反转操作。 - 查找字符串数组中的最长公共前缀:需要对字符串进行比较和查找最长相同前缀。 - 字符串消消乐:消除相邻相同字符,考察字符串遍历和条件判断。 - ...
- **解析**:连接字符串指的是将多个字符串合并成一个字符串的操作。 - **示例**: - 使用`+`运算符:`std::string s = "Hello" + "World";` - 使用`std::stringstream`:`std::stringstream ss; ss ; std::string...