CrackingtheCodeInterview之数组与字符串

来源:互联网 发布:csgo fps优化参数 编辑:程序博客网 时间:2024/05/31 19:33

//NO.1
//实现一个算法,确定一个字符串的所有字符是否全都不同。假使不允许使用额外的数据结构,又该如何处理?

初步想法:将字符串排序,然后比较相邻元素是否相同。

较好思路:1、字符串分为ASCII和Unicode两种,ASCII码共256种,Unicode码共65536种,可以定义bool型数组,并初始化为false,遍历字符串,每次将字符对应的bool型变量改为true,每次更改之前先判断是否已经更改,若已经更改,说明该元素重复了。

2、对第一种方法进行改进,若题目说明所有字符为a~z,共26个字母,可以考虑使用一个int型变量,4字节32位标记各个元素,初始化为0,每次将该字母对应的位置或为1,修改前先判断该位是否为1,用到了左移的知识点,如a<<b,即a左移b位。

//NO.2
//用C或C++实现void reverse(char* str)函数,即反转一个null结尾的字符串。

初步想法:遍历字符串找到结尾指针,交换初始指针和结尾指针指向的内容,并改变两个指针的大小使其逐渐靠近,知道出现相等或交叉的情况结束。

较好思路:与原思路一致。

//NO.3
//给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串 

初步想法:两个字符串分别排序,逐个进行比较即可。

较好思路:检查两字符串的各字符个数是否相同,定义一个256大小的数组,遍历str1并统计每个字符的数量(++),遍历str2并统计每个字符的个数(--);

//NO.4
//编写一个方法,将字符串中的空格全部替换为“%20”。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的“真实”长度。

初步想法:使用临时数组保存替换后的字符串。

较好思路:统计空格的个数,然后从字符串的尾部开始修改,直接将字符串挪到目标位置。


//NO.5
//利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。例如aabcccccaaa会变为a2b1c5a3,若压缩后的字符串没有变短,则返回原先的字符串。

初步想法:首先判断字符串中的字符是否存在重复,若存在重复就判断并进行修改,若不存在就直接返回。

较好思路:同上。


//NO.6
//给定一副由N*N矩阵表示的图像,其中每个像素的大小为4字节,编写一个方法,将图像旋转90度。不占用额外内存空间能否做到? 

初步想法:像剥洋葱一样一层一层的考虑问题,替换的是否进行分组,从而不需要额外内存空间。

较好思路:同上。时间复杂度为O(N*N),即遍历整个二维数组一遍。


//NO.7
//编写一个算法,若M*N矩阵中某个元素为0,则将其所在的行与列清零 

初步想法:记录矩阵中包含元素0的行和列,然后对所有包含0的列和行赋值为0;

较好思路:同上。


//NO.8
//假定有一个方法isSubstring,可检查一个单词是否为其他字符串的子串。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成,要求只能调用一次isSubstring。

初步想法:匹配两个字符串,知道一个字符串到了结尾,再从头开始进行匹配。

较好思路:将字符串s1s1相加构成一个新的字符串,然后判断字符串s2是否为字符串s1s1的字串,若是,即可证明旋转关系。


//CrackingTheCodeInterview Question List://NO.1//实现一个算法,确定一个字符串的所有字符是否全都不同。假使不允许使用额外的数据结构,又该如何处理? //#include <iostream>//#include <string> //#include <algorithm>//using namespace std;//bool HasRepeate(string str){//int n=str.size();//sort(str.begin(),str.end());//for(int i=1;i<n;i++){//if(str[i-1]==str[i]){//return true;//}//}//return false;//}//int main() {//string str;//while(cin>>str){//if(HasRepeate(str))//cout<<"The string has repeate char!"<<endl;//else//cout<<"The string does not have repeate char!"<<endl;//}//return 0;//}//NO.2//用C或C++实现void reverse(char* str)函数,即反转一个null结尾的字符串。 //#include <iostream>//#include <algorithm>//using namespace std;//void reverse(char* str){//int i=0;//while(str[i++]!='\0');//int n=i-2;//i=0;//while(i<n){//swap(str[i++],str[n--]);//}//}//int main() {//char str[50];//while(cin>>str){//reverse(str); //cout<<str<<endl;//}//return 0;//}//NO.3//给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串 //#include <iostream>//#include <algorithm>//#include <string> //using namespace std;//int main() {//string str1,str2;//while(cin>>str1){//cin>>str2;//if(str1.size()==str2.size()){//sort(str1.begin(),str1.end());//sort(str2.begin(),str2.end());//bool flag=false;//for(int i=0;i<str1.size();i++){//if(str1[i]!=str2[i]){//flag=true;//break;//}//}//if(!flag)//{//cout<<"Two string can reorder to be same!"<<endl;//}//else//cout<<"Two string cannot reorder to be same!"<<endl;//}//else//cout<<"Two string cannot reorder to be same!"<<endl;//}//return 0;//}//NO.4//编写一个方法,将字符串中的空格全部替换为“%20”。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的“真实”长度。 //#include <iostream>//#include <algorithm>//#include <string> //using namespace std;//int main() {//string str;//while(getline(cin,str)){//int n1=str.size();//int num=0;//for(int i=0;i<n1;i++){//if(str[i]==' ')//num++;//}//str.resize(n1+num*2);//for(int i=n1-1;i>=0&&num>0;i--){//if(str[i]==' '){//str[i+num*2]='0';//str[i+num*2-1]='2';//str[i+num*2-2]='%';//num--;//}//else{//str[i+num*2]=str[i];//}//}//cout<<str<<endl;//}//return 0;//}//NO.5//利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。例如aabcccccaaa会变为a2b1c5a3,若压缩后的字符串没有变短,则返回原先的字符串。 //#include <iostream>//#include <algorithm>//#include <string> //using namespace std;//int main() {//string str;//while(cin>>str){//bool flag=false;//int n=str.size();//for(int i=1;i<n;i++){//if(str[i]==str[i-1]){//flag=true;//break;//}//}//if(flag){//int num=1;//string temp;//temp+=str[0];//for(int i=1;i<n;i++){//if(str[i]==str[i-1]){//num++;//}//else{//temp+=('0'+num);//temp+=str[i];//num=1;//}//}//temp+=('0'+num);//str=temp;//}//cout<<str<<endl;//}//return 0;//}//NO.6//给定一副由N*N矩阵表示的图像,其中每个像素的大小为4字节,编写一个方法,将图像旋转90度。不占用额外内存空间能否做到? //#include <iostream>//#include <algorithm>//#include <string> //using namespace std;//void Rotation(int a[][5],int n){//int rt=0,ru=0,st=n-1,su=n-1;//while(rt<st&&ru<su){//for(int i=0;i<su-ru;i++){//int temp=a[rt][ru+i];//a[rt][ru+i]=a[st-i][ru];//a[st-i][ru]=a[st][su-i];//a[st][su-i]=a[rt+i][su];//a[rt+i][su]=temp;//}//rt++;//ru++;//st--;//su--;//}//}//int main() {//int a[5][5]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20},{21,22,23,24,25}};//int n=5;//Rotation(a,n);//for(int i=0;i<n;i++){//for(int j=0;j<n;j++){//cout.width(2);//cout<<a[i][j]<<" ";//}//cout<<endl;//}//return 0;//}//NO.7//编写一个算法,若M*N矩阵中某个元素为0,则将其所在的行与列清零 //#include <iostream>//#include <algorithm>//#include <string> //#include <vector>//#include <set>//using namespace std;//void ZeroClear(int a[][6],int m,int n,set<int>& row,set<int>& column){//for(int i=0;i<m;i++){//for(int j=0;j<n;j++){//if(a[i][j]==0){//row.insert(i);//column.insert(j);//}//}//}//for(set<int>::iterator it=row.begin();it!=row.end();it++){//for(int j=0;j<n;j++){//a[*it][j]=0;//}//}//for(set<int>::iterator it=column.begin();it!=column.end();it++){//for(int i=0;i<m;i++){//a[i][*it]=0;//}//}//}//int main() {//int a[5][6]={{1,2,0,3,4,5},{0,6,7,8,9,10},{11,0,12,13,14,15},{16,17,18,19,0,20},{21,22,23,24,25,26}};//int m=5,n=6;//for(int i=0;i<m;i++){//for(int j=0;j<n;j++){//cout.width(2);//cout<<a[i][j]<<" ";//}//cout<<endl;//}//set<int> row,column;//ZeroClear(a,m,n,row,column);//for(int i=0;i<m;i++){//for(int j=0;j<n;j++){//cout.width(2);//cout<<a[i][j]<<" ";//}//cout<<endl;//}//return 0;//}//NO.8//假定有一个方法isSubstring,可检查一个单词是否为其他字符串的子串。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成,要求只能调用一次isSubstring。//比如,waterbottle是erbottlewat旋转后的字符串。 //#include <iostream>//#include <algorithm>//#include <string> //#include <vector>//#include <set>//using namespace std;//bool JudgeRotation(string str1,string str2){//int m=str1.size(),n=str2.size();//if(m!=n)//return false;//int i=0,j=0;//int first=0;//bool same=false;//while(i!=m&&j!=m){//if(str1[i]==str2[j]){//if(!same){//same=true;//first=j;//}//i++;//j++;//} //else{//if(same){//same=false;//j=first+1;//i=0;//}//else{//j++;//}//}//}//if(same){//if(i==j)//return true;//j=0;//while(i<m){//if(str1[i++]!=str2[j++]){//return false;//}//}//return true;//}//else{//return false;//}//}//int main() {//string str1,str2;//while(cin>>str1){//cin>>str2;//if(JudgeRotation(str1,str2)){//cout<<"Yes"<<endl;//}//else{//cout<<"No"<<endl;//}//}//return 0;//}

1 0