笔经面经01---华为机试笔经面经

一、编程:
1、C语言输入输出:
(1) getchar() & putchar()
int getchar(void) 从屏幕读取下一个可用字符,并用它返回为一个整数。
int putchar() 该函数同一时间内只会输出一个单一的字符。

(2) gets() & puts() 函数
char *gets(char *s) 从stdin读取一行到s所指向的缓冲区,直到一个终止符或EOF。
int puts(const char *s) 把字符串s和一个尾随的换行符写入到stdout。
建议:在输入带有空格字符的字符串时使用char数组,gets函数区别于scanf函数是,gets会直接将一整行读进来,不会遇到空格就停下来

(3) scanf() & printf() 函数
int scanf(const char *format, …) 函数从标准输入流 stdin 读取输入,并根据提供的 format 来浏览输入。
int printf(const char *format, …) 函数把输出写入到标准输出流 stdout ,并根据提供的格式产生输出。
例子:输入以下格式:

4,2,6,4
#include
#include
int main()
{
    int i=0,j=0,len=0;
	char m0[100]={0};
    int m[100];//将输入的 提到数组里保存
      
	scanf("%s",m0);//或者gets(m0);m0=gets();
	len=strlen(m0);
    for(i=0; i<len; i++)
    {
		if(m0[i]==',')
		{
			continue;
		}else
		{
			m[j]=m0[i]-'0';
			j++;
		}
	}
	for(i=0; i<j; i++)
    {
    	printf("%d\n",m[i]);
    }
    return 0;
}

2、题型:
(1) 初级题:字符串处理 数字处理 数学运算 字符转换 进制转换 逻辑判断
(2) 中级题:简单的算法(数独问题,二维数组)和数据结构(链表 数组处理 )
(3) 高级题:更多的算法和数据结构,代码量大,栈、图、树、查找、搜索等等。动态规划
3、华为机试考点:
排序,求最大最小数,链表,大数、高精度数运算,字符串常见操作,数组常见操作,四则运算,求数的各种附属数,匹配问题,进制转换,二叉树,规划问题,最短路径问题,图联通问,对数字进行特殊判断。
4、判卷结果大致有“编译未通过”、“运行超时”、“部分测试用例未通过”、“全部测试用例通过”四种结果
(1) “编译未通过”,则说明提交的代码语法或者链接在这里插入代码片错误,点击页面上的编译结果,会给出编译信息,据此修改自己的代码;
(2) “运行超时”,建议检查一下自己的输入是否过于繁琐(比如明明可以一次读取一行,却一个字符一个字符输入),或者while、for循环是否能够保证正常退出;
(3) “部分测试用例未通过”,这就需要重新审题,检查自己漏掉了哪些输入情况(这个时候千万不要怀疑判卷平台,一定是你自己错了);
5、字符串问题:
在对字符串进行操作时,一定要记得结尾符 ’\0’,例如char a[10]中实际只能放入9个有用字符,最后一位需要放置结尾符。在字符串输入和for循环中经常会因为忽略了结尾符而出错。
6、每个题提交次数不能超过5次?????
7、字符操作
有很多机试题目需要对字符(不是字符串)进行判断和操作,这里列举一些常用的操作和编程技巧。
判断一个字符是数字: if(c>=’0’ && c<=’9’);
判断一个字符是大写字母: f(c>=’A’ && c<=’Z’);
将char型数字转换为int型的一位数: int b = c - ‘0’;
将int型数字转换为char型数字: char c = char(b + ‘0’);
将大写字母转换为小写字母: char xiaoxie = daxie + (‘a’ - ‘A’);

大小写转换:

for(int i=0; i<n; i++)
{
	if(s[i]>='A' && s[i]<='Z')
	{
		s[i]=s[i]-'A'+'a';
	}
}

8、字符串操作
依据条件筛选出一个长度不定的字符串:

int n = 0;
for(int i=0;i<n;i++)
{
	if(/a[i]符合条件/)
	{
	b[n] = a[i];
	N++;
	}
}
B[n] = ‘\0;

以下是string.h库中的常用函数
求字符串长度: int len = strlen(str);
字符串复制: strcpy();
字符串比较: strcmp();
字符串拼接: strcat();
查询字串: strchr();
查询子串: strstr();

以下是stdlib.h库中的常用函数
将数字字符串(如”136”)转换为int型:int i = atoi(str);
将数字字符串(如”136”)转换为float型:int f = atof(str);
将数字字符串(如”136”)转换为long型:int l = atol(str);
将int型多位数字转换为字符串型: itoa(str, i, 10);(第三个参数表示进制)

9、记录数组原位置并进行交换处理的问题
在编程中经常会遇到对数组元素进行交换,当交换并处理后,需要按原始位置输出时,可以使用结构体来简化编程。
例如,对一组整数的最大元素加上次大元素的值,次大元素加上第三大元素的值,第三大元素加上第四大元素的值……最小元素加0,依次对每一个元素进行处理,处理完成后按照原始数组的元素位置输出处理结果,使用结构体来编写程序会使得这种处理变简单,代码如下:

struct mydata
{
	int num;//存放数据
	Int index; //记录原始数据的下标位置
}
mydata data[n];
for(int i=0;i<n;i++)
{
	std::cin>>mydata.num;
	index = i;
}
for(int i=0;i<n;i++)//冒泡排序
{
	for(int j=0;j<n-1-i;j++)
	{
		if(data[j].num<data[j+1].num)
		{
			mydata temp = data[j];//交换的是整个结构体  而不只是结构体中的num
			data[j] = data[j+1];
			data[j+1] = temp;
		}
	}
}
for(int i=1;i<n;i++)//这里要注意,只能从最大元素开始
{
	data[i].num = data[i].num + data[i+1].num;
}
for(int i=0;i<n;i++)
{
	for(int j=0;j<n;j++)
	{
		if(i != data[j].index)  continue;
		else
		{
			std::cout<<data[j].num;
			break;
		}
	}
}

10、数字处理类:
(1)整数拆分:
将一个整数拆分开每一位,思路:
思路1:直接用字符串读入,将每一位用字符的形式输出
思路2:不断除以10 %10 /10
(2)进制转换:
十进制转换成x进制:

while(n!=0)
{
	res[i]=n%x;
	i++;
	n=n/x;
}

x进制转换成十进制:

for(i=0; i<length; i++)
{
	res=res*x+num[i];
}

(3)排序:
C/C++中自带有排序函数sort,位于头文件stdlib.h中,方便实现排序,具体用法为:

sort(a,a+len(a));//将数组a按照默认升序排列
sort(a,a+len(a),cmp);//将数组a按照cmp函数指定的规则排列,例如如下的为降序规则

bool cmp(int para1,int para2)
{
	return a>b;
}

二、面试:
1、手撕代码:
(1)排序:冒泡排序、快速排序、选择排序、简单插入排序、二分插入排序、希尔排序、归并排序,这些都是基础,必须掌握。

你可能感兴趣的:(笔经面经,华为,c语言,面试)