三六零 - 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) 如上题,将处理数据的线程使用线程池实现,即一个线程负责读取数据,另一个线程池负责处理数据。

⚠️ **GitHub.com Fallback** ⚠️