文章最前: 我是Octopus,这个名字来源于我的中文名--章鱼;我热爱编程、热爱算法、热爱开源。
这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的动态,一起学习,共同进步。
相关文章:
- LeetCode:55. Jump Game(跳远比赛)
- Leetcode:300. Longest Increasing Subsequence(最大增长序列)
- LeetCode:560. Subarray Sum Equals K(找出数组中连续子串和等于k)
题目描述:
给定一个字符串 S,返回 “反转后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转。
示例 1:
输入:"ab-cd"
输出:"dc-ba"
示例 2:
输入:"a-bC-dEf-ghIj"
输出:"j-Ih-gfE-dCba"
示例 3:
输入:"Test1ng-Leet=code-Q!"
输出:"Qedo1ct-eeLg=ntse-T!"
来源:力扣(LeetCode)
java实现方式1:
/**
* 仅仅反转字符
*
* @param S 字符串
* @return 字符串
*/
private String reverseOnlyLetters1(String S) {
if (S.length() <= 1) {
return S;
}
char[] chs = S.toCharArray();
int i = 0;
int j = chs.length - 1;
while (i < j) {
if (Character.isLetter(chs[i]) && Character.isLetter(chs[j])) {
swap(chs, i++, j--);
} else if (Character.isLetter(chs[i])) {
j--;
} else if (Character.isLetter(chs[j])) {
i++;
} else {
i++;
j--;
}
}
return String.valueOf(chs);
}
/**
* 交换字符
*
* @param chs 字符串数组
* @param i 位置i
* @param j 位置j
*/
private void swap(char[] chs, int i, int j) {
char temp = chs[i];
chs[i] = chs[j];
chs[j] = temp;
}
时间复杂度:O(n)
空间复杂度:O(1)
python实现方法1:
def reverse_only_letters(chs: str) -> str:
'''
反转字符串
Args:
chs: 字符串数组
Returns:
反转后字符串
'''
if len(chs) < 2:
return chs
arrs = list(chs)
i = 0
j = len(chs) - 1
while i < j:
if str(arrs[i]).isalpha() and str(arrs[j]).isalpha():
swap(arrs, i, j)
i += 1
j -= 1
elif str(arrs[i]).isalpha():
j -= 1
elif str(arrs[j]).isalpha():
i += 1
else:
i += 1
j -= 1
return ''.join(arrs)
def swap(chs: List[str], i: int, j: int)->None:
'''
交换数组位置
Args:
chs: 数组
i: 位置i
j: 位置j
Returns:
交换位置后的数组
'''
temp = chs[i]
chs[i] = chs[j]
chs[j] = temp
时间复杂度:O(n)
空间复杂度:O(1)