第一题 翻转字符串
把一个给定的字符串反转 笨方法,遍历整个给定的string,将数组string[n]中的第i个元素与第[n-1-i]个元素对调,下面为代码示例:
{% highlight c %} class Reverse { public: string reverseString(string iniString) { // write code here char c; int len = iniString.length(); for(int i=0; i < len / 2; i ++) { c = iniString[i]; iniString[i] = iniString[len - i - 1]; iniString[len - i - 1] = c; } return iniString; } }; {% endhighlight c %}
第二题 判定字符串中字符是否相同或不同
... 不细说、代码示例在下面:
{% highlight c %}
class Different { public: bool checkDifferent(string iniString) { // write code here for(int i=0;iniString[i]!='\0';i++) { for(int j=i+1;iniString[j]!='\0';j++){ if(iniString[i] == iniString[j]) return 0; } } return 1; } }; {% endhighlight c %}
第三题 确定两串乱序同构
(我觉得和第八题是一样的,这里是第八题的描述: 请将这个算法编写成一个函数,给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成。唯一不一样的地方可能就是第八题要求用并且只用一次issubstring这个函数吧。这里省略第八题。 )
给出的代码结构为:
{% highlight c %} class Same { public: bool checkSam(string stringA, string stringB) { // write code here }; {% endhighlight c %} 我的第一个想法很简单,遍历整个stringA和stringB,当在B中能找到该元素就在B数组中删除这个元素,直到最后判断B是否为空。但是....总之我这么想着写有误,会漏判应该返回 "false"的情况,下面为错误的代码示例:
{% highlight c %} class Same { public: bool checkSam(string stringA, string stringB) { // write code here if(stringA.length()!=stringB.length()) return false; for(int i=0;stringA[i]!='\0';i++){ for (int j=0;stringB[j]!='\0';j++){ if(stringA[i] == stringB[j]){ stringB.erase(j,1); } } } stringB.erase('\0'); //delete the last element in the string if(stringB.empty()) return true; return false; } }; {% endhighlight c %} 既然漏判了一个原本应该为"false"的情况那么我就加判一个,同样遍历A,当不能在B中找到A的该元素时我就立即返回"false".一下为通过的代码示例:
{% highlight c %} class Same { public: bool checkSam(string stringA, string stringB) { // write code here if(stringA.length()!=stringB.length()) return false; for(int i=0;stringA[i]!='\0';i++){ for (int j=0;stringB[j]!='\0';j++){ if(stringA[i] == stringB[j]){ stringB.erase(j,1); break; } else if((stringA[i] != stringB[j]) && (j == stringB.length()-1)) return false; } } stringB.erase('\0'); if(stringB.empty()) return true; return false; } }; {% endhighlight c %} 在看别人的讨论中看到大神们是这么想的,还是一样先从最简单的长度开始比较,然后定义一个存放了256个"0"的新数组,当在遍历的时候将A中的元素和B中的元素逐一进行记录,遇到A中的第n个元素该新定义的的数组的第[A[n]]个"0"自增1,而同样,遇到B的元素时自减1.也就是说若A和B是完全相同的组合数组那么意味着这个新定义的数组始终应该保持“0”的平衡。下面是该方法的代码示例:
{% highlight c %}
class Same { public: bool checkSam(string stringA, string stringB) { // write code here char count[256]={0}; if(stringA.size()!=stringB.size()) return false;
for(int i=0;i
return iniString;
return str;
}
}; {% endhighlight c %}
第六题 像素翻转
需要返回一个旋转后的NxN矩阵 函数样例给出如下:
{% highlight c %} class Transform { public: vector > transformImage(vector > mat, int n) { // write code here } }; {% endhighlight c %} 既然不能定义一个新的temp数组可能从替换的角度来思考这个问题更简便一些,首先从矩阵最外围的一圈来看:
{% highlight c %} for(int i=0;i