三六零 - milkandbread/summary-interview GitHub Wiki
2 不用乘法和加法增加8倍,现在用同样的方法增加7倍
增加8倍是左移3位。
增加7倍,a=1,b=2,c=4;
d=a|b|c 按位或
d=a^b^c; 异或
3 自己实现一个整形转字符串的函数,原型为int2str
string int2str(int num)
{
string str;
char s[11]={0123456789};
int len = 0;
int tmp = num;
while(tmp>100)
{
tmp /= 100;
len += 2;
}
while(tmp>10)
{
tmp /= 10;
len += 1;
}
while(len>0)
{
str = s[num%10]+str;
len--;
}
return str;
}
char* int2str(unsigned int values)
{
int len = 0;
const char digits[11] = "0123456789";
unsigned int tvalue = values;
while(tvalue >= 100)
{
tvalue /= 100;
len += 2;
}
if (tvalue > 10)
len += 2;
else if(tvalue > 0)
len++;
char* crtn = new char[len+1];
crtn += len;
*crtn = '\0';
do
{
*--crtn = digits[values%10];
} while (values /= 10);
return crtn;
}
4 下面代码有什么问题:
vector<int> vt;
//这里多次调用"vt.push_back(111);"插入数据到vt"
vector<int>::iterator it=vt.begin();
vt.push_back(5);
(*it) = 5
会在vt后面添加一个元素5,vt第一个元素被覆盖5.
5 下面语句中,c和d有什么区别
a)typedef int* typedef_intp;
b) #define define_intp int*
c) typedef_intp ta, tb;
d) define_intp d1, d2;
c 变化后为 int *ta, *tb;
d 变化后为 int *d1, d2;
6 给出下面函数的输出
char *returnstr()
{
char s[] = "hello";
printf("%d\n",sizeof(s));
printf("%d\n",strlen(s));
return s;
}
void main()
{
char *str = returnstr();
printf("%s\n",str);
}
段错误,因为s为局部变量
7 实现strlen函数
int strlen(const char *str)
{
if(str == NULL)
{
return 0;
}
int len=0;
while(*str!='\0')
{
str++;
len++;
}
return len;
}
8 单向链表原地逆转
struct Node {
int data;
Node *next;
}
Node *reverse(Node *header)
{
struct Node *p1 = header;
struct Node *p2 = p1->next;
struct Node *p3 = NULL;
while(p2 != NULL)
{
p3 = p2->next;
p2->next = p1;
p1= p2;
p2= p3;
}
header = NULL;
header = p1;
return header;
}
9 逆转句子中单词的顺序,如“hello world”->"world hello";
#include <iostream>
using namespace std;
void revesal(char * start, char* end){
char *temp_s = start;
char *temp_e = end;
while(temp_s < temp_e){
char temp= *temp_s;
*temp_s= *temp_e;
*temp_e = temp;
++temp_s;
--temp_e;
}
return;
}
void revesal_str(char *str){
if(str == NULL){
return;
}
char *start = str;
char *end = str;
while(*++end !='\0');
revesal(start, end-1);
cout << str << endl;
char *sub_start = str;
while(start < end + 1 ){
if(*start == ' ' || *start == '\0'){
char *temp = start - 1;
revesal(sub_start,temp);
while(*++start ==' ');
sub_start = start;
continue;
}
++start;
}
}
int main()
{
char s[] = "hello world";
char *p = s;
revesal_str(p);
cout<<s<<endl;
return 0;
}
char *reverse(char *s)
{
if(s == NULL)
{
return NULL;
}
char c;
char *first = s;
char *end = strlen(s);
while(first != end)
{
c = *first;
first = *end;
end = c;
first++;
end--;
}
return s;
}
char *ret_line(char *s)
{
if(s==NULL)
{
return NULL;
}
int i=0;
char *tmp = reverse(s);
char *first = tmp;
char *end = tmp;
for(i=0;i<strlen(s);i++)
{
if(*end = " ")
{
reverse(end-first);
first=end;
}
end++;
}
return s;
}
char *R(char *str, int len) //将句子所有的字母颠倒顺序
char *pLast = str + len - 1;
char *pBegin = str;
char temp;
while (pBegin < pLast)
{
temp = *pBegin;
*pBegin = *pLast;
*pLast = temp;
pBegin++;
pLast--;
}
return str;
}
char *RS(char *str)
{
char *pBegin = str;
char *pEnd = str;
R(str, strlen(str)); //先将输入的一句话的所有字母全部颠倒顺序
while (*pEnd != '\0')
{
while (*pEnd != '\0' && *pEnd != ' ')
{
pEnd++;
}
R(pBegin, pEnd - pBegin); //将每个单词中的字母颠倒顺序,这样就变成了之前的顺序
if(*pEnd == '\0')
{
break;
}
pEnd++;
pBegin = pEnd;
}
return str;
}
10 在一个字符串中找到第一个只出现一次的字符, 如:“abaccdeff",输出b
char ret_first_char(const char *s)
{
if(s == NULL)
{
return "";
}
char alph[26]={0};
while(*s != '\0')
{
alph[*s-'a']++;
s++;
}
for(int i=0;i<26;i++)
{
if(alph[i] == 1)
{
break;
}
}
return i+'a';
}
char firstSingle(char *str)
{
int arr[256]={0};
char *pt = str;
if (*pt == '\0')
{
return '\0';
}
memset(arr, 0, sizeof(arr));
while ('\0' != *pt)
{
arr[*pt++]++;
}
while ('\0' != *str)
{
if (arr[*str] == 1)
{
return *str;
}
str++;
}
return '\0';
}
11 输入一颗二元查找树,将该树转换成他的镜像(左右对调),递归循环两种实现。
void get_mirror(struct TreeNode *root)
{
if(root == NULL || (root->left == NULL && root->right == NULL)
{
return NULL;
}
struct TreeNode *tmp = root->left;
root->left = root->right;
root->right = tmp;
if(root->left != NULL)
{
get_mirror(root->left);
}
if(root->right != NULL)
{
get_mirror(root->right);
}
}
void get_mirror(struct TreeNode *root)
{
if(root == NULL || (root->left == NULL && root->right == NULL)
{
return NULL;
}
struct TreeNode *tmp = NULL;
stack<TreeNode> stk;
stk.push(root);
while(!stk.empty())
{
tmp = stk.top();
stk.pop();
if(tmp->left != NULL || tmp->right != NULL)
{
struct TreeNode *tp = tmp->left;
tmp->left = tmp->right;
tmp->right = tp;
}
if(tmp->left != NULL)
{
stk.push(tmp->left);
}
if(tmp->right != NULL)
{
stk.push(tmp->right);
}
}
}
12 请实现一个简单文本文件处理程序,要求用两个线程实现(一个生产者一个消费者线程),一个线程负责读数据,另一个处理线程按行处理输入的文本数据,针对每一行输入数据调用一个外部函数:void LineProcess(const char* line,size_t l) 如上题,将处理数据的线程使用线程池实现,即一个线程负责读取数据,另一个线程池负责处理数据。