java给定一个字符数组, 要求去掉首尾的空格,要求时间复杂度O(n), 空间复杂度O(1)。
时间: 2023-06-10 19:07:15 浏览: 133
可以利用双指针的方式来实现这个功能,具体步骤如下:
1. 定义两个指针,一个指向字符数组的开头,一个指向字符数组的结尾。
2. 从头开始遍历字符数组,直到找到第一个非空格字符为止,记录其下标。
3. 从尾开始遍历字符数组,直到找到第一个非空格字符为止,记录其下标。
4. 利用记录的下标,从原数组中截取出去掉首尾空格的子串。
Java代码如下:
```java
public static String trimSpaces(char[] s) {
int left = 0, right = s.length - 1;
// 找到第一个非空格字符的下标
while (left <= right && s[left] == ' ') {
left++;
}
// 找到最后一个非空格字符的下标
while (left <= right && s[right] == ' ') {
right--;
}
// 截取子串
StringBuilder sb = new StringBuilder();
for (int i = left; i <= right; i++) {
if (s[i] != ' ') {
sb.append(s[i]);
}
}
return sb.toString();
}
```
这个算法的时间复杂度为O(n),空间复杂度为O(1)。
相关问题
java给定一个字符数组, 要求去掉首尾的空格,同时其他位置的空格合并为一个空格。要求时间复杂度O(n), 空间复杂度O(1)。
可以采用类似双指针的方法,一个指针指向当前处理的位置,一个指针指向处理后的位置。具体步骤如下:
1. 去掉首部空格:从头开始遍历数组,跳过空格,当遇到非空格字符时停下。
2. 合并其他位置的空格:从非空格字符位置开始,继续遍历数组,遇到连续的空格时只保留一个空格。
3. 去掉尾部空格:从尾部开始向前遍历数组,跳过空格,当遇到非空格字符时停下。
4. 将处理后的字符复制到原数组中。
代码实现如下:
```java
public static void trim(char[] chars) {
int start = 0, end = chars.length - 1;
// 去掉首部空格
while (start <= end && chars[start] == ' ') {
start++;
}
// 合并其他位置的空格
boolean flag = false;
int index = start;
for (int i = start; i <= end; i++) {
if (chars[i] == ' ') {
if (flag) continue;
flag = true;
} else {
flag = false;
}
chars[index++] = chars[i];
}
// 去掉尾部空格
while (index > start && chars[index - 1] == ' ') {
index--;
}
// 复制处理后的字符到原数组中
System.arraycopy(chars, start, chars, 0, index - start);
}
```
时间复杂度为O(n),空间复杂度为O(1)。
阅读全文