您的位置:首页 > 职场人生

面试之数组&字符串

2015-09-23 10:56 483 查看
1.编程实现计算字符串的长度

int strlen(const char *strSrc){
assert(NULL != strSrc);    //src必须有效
int len = 0;
while('\0\ != *strSrc++ ){
len++;
}

return len;

}
/*每次循环只做一次自增*/
int strlen(const char *src){
assert(NULL != src);
const char *temp = src;
while('\0' != *src++ )
return (src-temp-1);

}


2.编程实现字符串中子串的查找

const char *strstr(const char *src,const char *sub){
cosnt char *bp,sp;
if(NULL == src || NULL == sub){//判断src 和 sub 是否有效
return src;
}
while(*src){//遍历src字符串
bp = src;
sp = sub;
do{
if(!*src){
return src;
}
} while(*bp++ == *sp++)

src ++;
}
return NULL;
}


4.编程实现库函数strcat

char *strcat(char *dest, const char *src){
char *ret;
ret = dest;
while(*dest++);  //查找到目的串的串尾
dest--;
while(*dest++ = *src++);  //拼接
return ret;
}


5.编程实现删除字符串中指定的字符

char *deleteChar(char *str,char c){
char *head = NULL;
char *p = NULL;
if(NULL == str){  //检查合法性
return NULL;
}
head = p = str;
while(p++){
if(*p != c){
*str++ = *p; //以重写str的方式来过滤c
}

}
str = '\0';
return head;

}


6.从字符串的指定位置开始删除指定长度的字符串

char *deleteChars(char *str,int pos,int len){
char *p = str + pos -1;
int tt = strlen(str);

//检查pos是否大于1,pos是否超出字符串的长度
if((pos < 1) || (p - str) >tt)
return str;
//不够删的  直接截取到p;
if((p + len - str) > tt){
p= '\0';
return str;
}
//正常从p开始删除len个字符串
while(*p && *(p+len)){
*p =*(p+len);
++p;
}
*p = '\0';
return str;

}


7.编程实现字符串的循环右移

void loopMove(char *str , int n){
int i = 0;
char *temp = NULL;
int strLen = 0;
char *head = str;

while(*str++);
strLen = str - hand -1;

n=n %strLen;
temp = (char *)malloc(n);
for(i = 0; i< n; ++i){
temp[i] = head[strLen - n + i];
}
for(i = strLen - 1;i >= n;i--){
head[i] = head[i-n];

}
for(i = 0; i < n; ++i){
head[i] = temp[i];
}
free(temp;)

}


8.编程实现字符串反转函数strrev

char *strrev(char *str,int len){
if(len <= 1)
return str;
char *p = str+len-1;
*p   ^= *str;
*str ^= *p;
*p   ^= *str;
return strrev(str+1,len-2)-1;

}


9.判断字符串是否为回文

int isRevStr(char *str){
int i,len;
int found = i;
if(str == NULL){
return -1;
}
len =strlen (str);
for(i = 0;i < len/2;++i){
//遍历过程中若发现头尾字符不等,则不是回文
if(*(str+i) != *(str+len-i-1)){
found = 0;
break;
}
}
return found;
}


10.编程实现memcpy函数

void *memcpy(void *memTo,const void *memFrom,size_t size){
assert((memTo != NULL)&&(memFrom != NULL));
char *tempFrom = (char *)memFrom;
char *tempTo = (char *)memTo;
while(size -- > 0 )
*tempTo++ =*tempFrom++;
return memTo;
}


11.实现strcpy函数

char *strcpy(char *strDest,const char *strSrc){
if((strDest == NULL)||(strSrc = NULL)){
return NULL;
}
char *strDestCoopy = strDest;
while(*strDest++ = *strSrc++)!='\0');
return strDestCopy;

}


8.拓扑结构相同子树的问题

对于两棵彼此独立的二叉树A和B,请编写一个高效算法,检查A中是否存在一棵子树与B树的拓扑结构完全相同。

给定两棵二叉树的头结点A和B,请返回一个bool值,代表A中是否存在一棵同构于B的子树。

9.变位词问题

对于两个字符串A和B,如果A和B中出现的字符种类相同且每种字符出现的次数相同,则A和B互为变形词,请设计一个高效算法,检查两给定串是否互为变形词。

10.判断两个词是否互为旋转词

“`

class Rotation {

public:

int match(const string& target,const string& pattern)

{//暴力匹配算法

int target_length = target.size();

int pattern_length = pattern.size();

int target_index = 0;

int pattern_index = 0;

while(target_index < target_length && pattern_index < pattern_length)

{

if(target[target_index]==pattern[pattern_index])

{

++target_index;

++pattern_index;

}

else

{

target_index -= (pattern_index-1);

pattern_index = 0;

}

}

if(pattern_index == pattern_length)

{

return target_index - pattern_length;

}

else

{

return -1;

}

}

bool chkRotation(string A, int lena, string B, int lenb) {
// write code here
if(lena == lenb ){

string sum(A+A);
if(match(sum,B) != -1)
return true;

}

return false;
}


};

11.一个字符串的单词间逆序

12.字符串移位的问题

对于一个字符串,请设计一个算法,将字符串的长度为len的前缀平移到字符串的最后。

给定一个字符串A和它的长度,同时给定len,请返回平移后的字符串。

13.拼接最小字典序

对于一个给定的字符串数组,请找到一种拼接顺序,使所有小字符串拼接成的大字符串是所有可能的拼接中字典序最小的。

给定一个字符串数组strs,同时给定它的大小,请返回拼接成的串。

14.空格串替换练习

请编写一个方法,将字符串中的空格全部替换为“%20”。假定该字符串有足够的空间存放新增的字符,并且知道字符串的真实长度(小于等于1000),同时保证字符串由大小写的英文字母组成。

15.合法括号序列判断

对于一个字符串,请设计一个算法,判断其是否为一个合法的括号串。

给定一个字符串A和它的长度n,请返回一个bool值代表它是否为一个合法的括号串。

16.最长无重复字符子串

对于一个字符串,请设计一个高效算法,找到字符串的最长无重复字符的子串长度。

给定一个字符串A及它的长度n,请返回它的最长无重复字符子串长度。保证A中字符全部为小写英文字符,且长度小于等于500。

17.设计一个算法,不允许使用额外的数据结构,判定一个字符串中的字符是否全不相同。(offer1.1)

18.实现字符串的反转

19.利用字符串重复出现的次数实现字符串的压缩(JD1.5)

aabcccccaaa -> a2b1c5a3

20.给定一个由NxN矩阵组成的图像,每个像素的大小是4字节,编写一个算法将图像旋转90度,并且不使用额外的数据结构。(JD1.6)

21.编写一个算法,MxN矩阵中的某个元素为0,将其所在的行和列清零(JD1.7)

22.调整数组顺序的问题

输入一个整数数组,实现一个函数来调整该数组中的数字的顺序,所有奇数位于数组的前半部分,所有的偶数位于数组的后半部分(offer14)

解法:在扫描数组的时候,只要发现偶数在奇数的前面就交换它们的位置,

维护两个指针,一个指向数组的第一个数字,一个指向最后一个数字,在他们相遇之前,如果第一个指针的内容是偶数,第二个数字的奇数,就交换(注意,两个指针并不是)

23.顺时针打印矩阵(offer20)

输入一个矩阵,按照从外向里的以顺时针的顺序依次打印每一个数字

24.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: