首页新闻找找看学习计划

阿里巴巴笔试题求解,要求空间复杂度O(1)啊,变态

0
悬赏园豆:5 [已解决问题] 解决于 2014-06-17 20:30

字符串“sports.sina.com.cn”反向为“cn.com.sina.sports”注意不是完全的反向,要求:时间复杂度o(n),空间复杂度O(1),主要是复杂度要求高,不然很容易想出来,求大家给分析分析。

stone2317的主页 stone2317 | 初学一级 | 园豆:149
提问于:2013-05-20 09:20
< >
分享
最佳答案
0

O(1)表示 不管字符串有多长, 反向用的临时空间保持不变。

void Main()
{
    string input = "sports.sina.com.cn"; 
    char[] array = input.ToCharArray();
    
    string output = ReversePartial(input.ToCharArray(), '.');
    Console.WriteLine(output);
}


string ReversePartial(char[] input, char seperator)
{
    Reverse(ref input, 0, input.Length - 1);
        
    char tmp = new char();
    int head, tail;
    head = tail = 0;
    
    for(int i = tail; i < input.Length; i++)
    {
        if (input[i] == seperator)
        {
            tail = i - 1;
            
            if (head < tail)
            {
                Reverse(ref input, head, tail);
                    head = i + 1;                
            }    
        }
    }
    if (head > tail && head < input.Length)
        Reverse(ref input, head, input.Length - 1);
    
    return new string(input);
}
void Reverse (ref char[] input, int startIndex, int endIndex)
{
    char tmp = new char();
    for(int i = 0; i <= (endIndex - startIndex) / 2; i++)
    {
        tmp = input[startIndex + i];
        input[startIndex + i] = input[endIndex -i];
        input[endIndex -i] = tmp;
    }
}
收获园豆:5
gunsmoke | 老鸟四级 |园豆:3592 | 2013-05-21 07:12
其他回答(3)
0

所谓空间复杂度,是指在算法运行期间,临时占用的存储空间的量度。所以我们只需要一个临时空间来交换所有的字符串。

思路:倒序取,然后组合。将字符串以.作为分隔标记

囡囡的男那岸 | 园豆:202 (菜鸟二级) | 2013-05-20 11:15
0

关注一下

@@@一统@@@ | 园豆:1551 (小虾三级) | 2013-05-20 12:48
1

非常简单,先对整个字符串做 strrev ,很显然,空间是 O(1),时间是 O(n)

接着对每个单词做 strrev,同样显然,空间依然是 O(1),时间是 O(n)。

综合以上,就是答案。

提示:两个字符指针即可,char* pStartPos, *pEndPos;

思路已足够,代码太简单,不给你具体代码了。

hoodlum1980 | 园豆:543 (小虾三级) | 2013-05-25 05:45
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册