题目
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组char[]的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题。
你可以假设数组中的所有字符都是ASCII码表中的可打印字符。
思路
单指针
从首位到中间位置,[0,length/2),逐个与对应位置(length-1-i)交换。交换方式:临时变量,a=a+b b=a-b a=a-b(可能超出数据类型范围)。复杂度分析
时间复杂度:O(N),N为字符串长度。空间复杂度:O(1)。
class Solution {
public void reverseString(char[] s
) {
int length
=s
.length
;
for(int i
=0;i
<length
/2;i
++){
char c
=s
[i
];
s
[i
]=s
[length
-1-i
];
s
[length
-1-i
]=c
;
}
}
}
class Solution {
public void reverseString(char[] s
) {
int length
=s
.length
;
for(int i
=0;i
<length
/2;i
++){
s
[i
]=(char)(s
[i
]+s
[length
-1-i
]);
s
[length
-1-i
]=(char)(s
[i
]-s
[length
-1-i
]);
s
[i
]=(char)(s
[i
]-s
[length
-1-i
]);
}
}
}
双指针
从首位和末位开始,向中靠拢,逐一交换。交换方式:临时变量,a=a+b b=a-b a=a-b(可能超出数据类型范围)。复杂度分析
时间复杂度:O(N),N为字符串长度。空间复杂度:O(1)。
class Solution {
public void reverseString(char[] s
) {
for(int left
=0,right
=s
.length
-1;left
<right
;left
++,right
--){
char c
=s
[left
];
s
[left
]=s
[right
];
s
[right
]=c
;
}
}
}
class Solution {
public void reverseString(char[] s
) {
for(int left
=0,right
=s
.length
-1;left
<right
;left
++,right
--){
s
[left
]=(char)(s
[left
]+s
[right
]);
s
[right
]=(char)(s
[left
]-s
[right
]);
s
[left
]=(char)(s
[left
]-s
[right
]);
}
}
}