您的位置:首页 > 其它

渣基础:比照Hawstein学Cracking the coding interview(2)

2014-10-10 14:12 399 查看
作者:Hawstein

出处:http://hawstein.com/posts/1.4.html

声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处。

Q1.4 写一个函数判断两个字符串是否是变位词。

变位词(anagrams)指的是组成两个单词的字符相同,但位置不同的单词。比如说,
abbcd和abcdb就是一对变位词。

方法一:是用STL里的sort方法,那么时间复杂度就是O(nlogn)时间排序,O(n)的时间来比较是否相等。其中字符串的是否相等,可调用s.compare(t),若相等,则为0.

方法二:统计每个字符串里各个字符出现的字数,然后判断字符出现次数是否相同。作者开了一个256的整数数组,遍历第一个字符串时,将相应的字符数次数加1;遍历第二个字符串时,将相应字符出现的字数减一,要是最后每个数都为0,就说明是一堆变位词。

Q1.5 写一个函数,把字符串中所有的空格替换为%20


我的方法跟他的一样,不过在取c[]时候,用的是记录空格数,然后:

<span style="white-space:pre">	</span>for(int i=0;i<len;i++)
	{
		if(s[i]==' ')
		{
			c[i+2*p]='%';
			c[i+2*p+1]='2';
			c[i+2*p+2]='0';
			p++;
		}
		else
			c[2*p+i]=s[i];
	}


他写的是:

<span style="white-space:pre">	</span>for(int i=0; i<len; ++i)
    {
        if(c[i] == ' ')
        {
            cc[p] = '%';
            cc[p+1] = '2';
            cc[p+2] = '0';
            p += 3;
        }
        else
        {
            cc[p] = c[i];
            ++p;
        }
    }


感觉比我写的要好一点。。。他还有一种情况写的是原串空间足够大,则直接在原串上从后向前改。

Q1.6
一张图像表示成NxN的矩阵,图像中每个像素是4个字节,写一个函数把图像旋转90度。 你能原地进行操作吗?(即不开辟额外的存储空间)

作者的方法采用的是先对角线处理,然后再上下翻转,也就是分两次。

这里我自己写的时候碰到的问题:

1.没想到分两步来旋转矩阵,感觉难解。通式是

2.在循环次数上出错,倒置最后矩阵不变了。。。要注意循环的次数。

PS:在这题上 作者的方法有点小问题,就在于它函数的形参是a[][4],通用性上并不好,因此我查了另外一种方法:

转载自:http://blog.csdn.net/sunnyyoona/article/details/18566587

void RotateImage(vector<vector<int> > &matrix)
这么写的话,就可以通过n=matrix.size() 来判断矩阵大小,当然在初始化的时候 就需要用push_back了。

vector<int> row1 = {1,2,3};  
    vector<int> row2 = {4,5,6};  
    vector<int> row3 = {7,8,9};  
    vector<vector<int>> matrix;  
    matrix.push_back(row1);  
    matrix.push_back(row2);  
    matrix.push_back(row3);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: