面试题1

计算机网络重要知识点总结 面试必备
https://blog.csdn.net/u011225629/article/details/45224279
C语言面试专用题库
1. C/C++笔试面试经典题目一
https://wenku.baidu.com/view/51dc37cd77eeaeaad1f34693daef5ef7ba0d1211.html
100条经典C语言笔试题目

面试技巧、简历书写、项目经验
https://blog.csdn.net/qq_42280739/article/details/83927218
https://xiaozhuanlan.com/achieve_offer

零、后加补充:

1. sizeof

typedef union {long i; int k[5]; char c;} DATE;
typedef union {double i; int k[5]; char c;} DATE2;
DATE 32位下20字节,64位下24字节,因为long类型决定DATE的对齐值
DATE2 24位
struct data { char cat; DATE cow; char dog;};
64位下struct data为40字节,因为DATE是8字节对齐,会影响到data

一、一般题

1. 进程和线程的差别

进程是程序的一次执行。线程可以理解为进程中执行的一段程序。
进程间是独立的,表现在内存空间、上下文环境上。线程运行在进程空间中。线程属于进程,当进程退出时该进程中所产生的线程都会被强制退出。线程占用的资源少于进程所占用的资源。

操作系统以进程为单位,分配系统资源(堆区、BSS段、数据段、代码段等),所以进程是资源分配的最小单位。
线程存在于进程中,是操作系统调度执行的最小单位。
进程自己基本不拥有系统资源,只拥有一点在运行中必不可少的资源(如资源计数器,寄存器和栈),但是它与同属一个进程的其他线程共享进程所拥有的全部资源。
进程有自己的地址空间,线程使用进程的地址空间,也就是说,进程里的资源,线程都是有访问权限的,比如堆、栈、静态存储区等。
线程有自己的栈,但这个栈仍然是使用进程的地址空间,只是这块空间被线程标记为栈。没有线程都有自己私有的栈,这个栈是不可以被其他线程所访问的。
进程所维护的是程序所包含的资源(静态资源),如:地址空间,打开的文件句柄集,文件系统状态,信号处理handler等。
线程所维护的是运行相关的资源(动态资源),如:运行栈,调度相关的控制信息,待处理的信号集等。
线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护,而进程正好相关

2. tcp和udp的区别

tcp是传输控制协议,提供的是面向连接、可靠的字节流服务。tcp提供超时重传、丢弃重复数据、检验数据、流量控制等功能,保证数据可靠的从一端传到另一端。
udp是用户数据报协议,是一个简单的面向数据报的传输层协议,不提供可靠性。

3. 划分子网

如果把一个网络40.15.0.0分成两个子网,第一个子网是40.15.0.0/17,那么第二个子网将会是_D_.
A: 40.15.1.0/17 B: 40.15.2.0/16 C:40.15.100.0/17 D: 40.15.128.0/17

如何将一个网络分为两个子网、如何通过已知IP和子网掩码计算其同一网段的主机IP

4. 在子网210.27.48.21/30种有多少个可用地址?分别是什么?

210.27.48.21/30代表的子网的网络号是30位,即网络号是210.27.48.21 & 255.255.255.251=210.27.48.20,此子网的地址空间是2位,即可以有4个地址:210.27.48.20,210.27.48.21,210.27.48.22,210.27.48.23.第一个地址的主机号(host number/id)是0,而主机号0代表的是multicast地址.最后一个地址的最后两位是11,主机号每一位都为1代表的是广播(broadcast)地址.所以只有中间两个地址可以给host使用.其实那个问题本身不准确,广播或multicast地止也是可以使用的地址,所以回答4也应该正确,当然问的人也可能是想要你回答2

5.
float a = 1.0f;;
cout << (int)a << endl;		//1
cout << (int&)a << endl;	//1065353216

float b = 0.0f;
cout << (int)b << endl;		//0
cout << (int&)b << endl;	//0
6. 求最小公约最大公倍数

https://blog.csdn.net/foreverling/article/details/46011421

最大公约数:辗转相除法
最小公倍数: 两数相乘再除以最大公约数

7. 数组排序算法

https://www.cnblogs.com/guanshan/p/guan028.html
快速排序
http://www.sohu.com/a/246785807_684445
https://blog.csdn.net/nrsc272420199/article/details/82587933

void quickSort(int arr[], int begin, int end)
{
    int left = begin;
    int right = end;
    int val = arr[begin];
    
    if (begin >= end)		//判断条件必须是这样,比如2 3 4  或者 3 2 1 6
        return;
    while (left < right)
    {
        while ((left < right) && (arr[right] >= val))
            right--;
        if (left == right)				//这里就可以退出了。不然会发生错误
            break;
        arr[left++] = arr[right];
        
        while ((left < right) && (arr[left] < val))
            left++;
        if (left == right)				//这里就可以退出了。不然会发生错误
            break;
        arr[right--] = arr[left];
    }
    arr[left] = val;
    quickSort(arr, begin, left - 1);
    quickSort(arr, right + 1, end);
}
8. 二分查找

二分查找
你真的会二分查找吗
二分查找变种方法总结:

while (left <=  right) 这句话总是不变的
{
	middle = (left + right) / 2;
	if (arr[middle] > key)	这句话也总是对的,但要考虑这里需不需要加上=号
	{
		right = middle -1;
	}
	else 
		left  = middle +1;
}

这里考虑返回的是right还是left

构造时如果不好判断,可以考虑正常情况下,是返回left还是right,再把特殊的那个合进去,从而确定该归于哪个。
比如:
查找最后一个等于或者小于key的元素
考虑1 2 3 查找比4小的,返回right
再考虑 1 2 3 查找小于等于2的情况

9. 15道使用频率极高的基础算法题

https://blog.csdn.net/foreverling/article/details/45891029

10. 把一个int型数组中的数字拼成一个串,这个串代表的数字最小;

qsort 的函数原型是
void qsort(voidbase,size_t num,size_t width,int(__cdeclcompare)(const void*,const void*));
各参数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针

先将数字转换成字符串存在数组中,在通过qsort排序,在排序用到的比较函数中,将要比较的两个字符串进行组合,如要比较的两个字符串分别是A,B,那么组合成,A+B,和B+A,在比较A+B和B+A,返回strcmp(A+B, B+A),经过qsort这么一排序,数组就变成从小到大的顺序了,组成的数自然是最小的。

//把一个int型数组中的数字拼成一个串,是这个串代表的数组最小
#define MaxLen 10 
int Compare(const void* str1,const void* str2)
{
    char cmp1[MaxLen*2+1];
    char cmp2[MaxLen*2+1];
    strcpy(cmp1,*(char**)str1);
    strcat(cmp1,*(char**)str2);

    strcpy(cmp2,*(char**)str2);
    strcat(cmp2,*(char**)str1);
    return strcmp(cmp1,cmp2);
}  
void GetLinkMin(int a[],int len)
{
    char** str=(char**)new int[len];
    for (int i=0;i<len;i++)
    {
        str[i]=new char[MaxLen+1];
        sprintf(str[i],"%d",a[i]); 
    }

    qsort(str,len,sizeof(char*),Compare);
    for (int i=0;i<len;i++)
    {
        cout<<str[i]<<" ";
        delete[] str[i] ;
    }
    delete[] str;
} 
void GetLinkMinTest()
{
    int arr[]={123,132,213,231,321,312};
    GetLinkMin(arr,sizeof(arr)/sizeof(int));
}

二、找规律题一般

1. 求一个字符串中连续出现次数最多的子串

https://blog.csdn.net/foreverling/article/details/46883515

2. 找出所有最长连续重复子串及其个数

https://blog.csdn.net/foreverling/article/details/46888863

3. 输入一行字符串,找出其中出现的相同且长度最长的字符串,输出它及其首字符的位置

https://blog.csdn.net/kaitankedemao/article/details/26357465

三、找规律体麻烦

1. 统计0到n之间1的个数

https://blog.csdn.net/foreverling/article/details/46892309
计算4 000 000 000以内的最大的那个f(n)==n的值,函数f的功能是统计0到n之间所有数字中1的个数和
https://blog.csdn.net/ancientmoondjay/article/details/62049282

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值