面试之数组&字符串
2015-09-23 10:56
483 查看
1.编程实现计算字符串的长度
2.编程实现字符串中子串的查找
4.编程实现库函数strcat
5.编程实现删除字符串中指定的字符
6.从字符串的指定位置开始删除指定长度的字符串
7.编程实现字符串的循环右移
8.编程实现字符串反转函数strrev
9.判断字符串是否为回文
10.编程实现memcpy函数
11.实现strcpy函数
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;
}
}
};
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.
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.
相关文章推荐
- 面向对象的5个基本设计原则:
- 黑马程序员---java基础---运算符、键盘录入、流程控制语句
- 面试之代码规范(未完)
- 面试常问题的Jvm的原理
- 黑马程序员---java基础---常量、变量、运算符
- 作为一名Java程序员,我为什么不在生产项目中转向Go
- 面试题14:调整数组顺序使奇数位于偶数前面
- 面试题
- 面试题13:在O(1)时间删除链表结点
- 面试题12:打印1到最大的n位数
- 面试题11:数值的整数次方
- 面试题10:二进制中1的个数
- 面试题8:旋转数组的最小数字
- 13 种激励程序员的方法
- iOS进阶面试题----Block部分
- iOS进阶面试题----多线程
- 面试题7:用两个栈实现队列
- PHP面试总结
- 面试题6:重建二叉树(前序遍历和中序遍历)
- 程序员被人喜欢的13点原因