百度的解释:
在计算机科学中,一个原地算法(in-place algorithm)是一种使用小的,固定数量的额外之空间来转换资料的算法。当算法执行时,输入的资料通常会被要输出的部份覆盖掉。不是原地算法有时候称为非原地(not-in-place)或不得其所(out-of-place)。
简单来说,就是在不新建大量额外空间(就是固定空间,无论数据多大,都不改变的那种)的基础上对原数据进行操作。
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
示例 1:
输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]
示例 2:
输入:["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]
public void reverseString(char[] s) {
int len = s.length;
for(int i =0;i<len/2;i++)
{
char temp = s[len-i-1];
s[len-i-1] = s[i];
s[i] = temp;
}
}
也就名字高大上点。
******************************************************************************************************************************
给定一组字符,使用原地算法将其压缩。
压缩后的长度必须始终小于或等于原数组长度。
数组的每个元素应该是长度为1 的字符(不是 int 整数类型)。
在完成原地修改输入数组后,返回数组的新长度。
进阶:
你能否仅使用O(1) 空间解决问题?
class Solution {
public int compress(char[] chars) {
int cur = 0,write = 0;//cur保留指针,write写指针
for(int read = 0;read < chars.length;read++){
//当读到最后一个字符,或者下一个字符与当前不同时,则到达连续区块的结尾。
if(read+1==chars.length||chars[read]!=chars[read+1]){//顺序不能颠倒,否则数组越界
chars[write++] = chars[cur];//将字符写入
if(read>cur){//如果长度大于一,写入个数
for(char c :(""+(read-cur+1)).toCharArray()){
chars[write++] = c;
}
}
cur = read+1; //cur重新定位
}
}
return write;
}
}
保留指针 cur,指向当前读到连续字符串的起始位置。
从左到右进行读取。当读到最后一个字符,或者下一个下一个字符与当前不同时,则到达连续区块的结尾。
当我们到达连续区块的结尾时,就从 write 写入压缩的结果。chars[cur] 为字符,read - cur+ 1 (若大于 1)为长度。
复杂度分析
时间复杂度:O(N),其中 N 是 chars 的长度。
空间复杂度:O(1),三个指针的占用空间。
经典