其它的请参考:https://blog.csdn.net/HIT_Coding_Cat/article/details/52843393
华为机试到目前为止,历年来都是三道编程题,第一道题100分,第二道题200分,第三道题300分,大多情况难度依次递增,个人认为其主要考察对编程语言的运用和简单的算法设计
1.字符串问题
在对字符串进行操作时,一定要记得结尾符’\0’,例如char a[10]中实际只能放入9个有用字符,最后一位需要放置结尾符。在字符串输入和for循环中经常会因为忽略了结尾符而出错。
2.每个题提交次数不能超过5次,C++语言在提交时,不能有#include ”stdafx.h”和system(“pause”)等语句,主函数也不能是int _tmain(int argc, _TCHAR* argv[])而应当直接写成int main()
3.程序运行前后的输入输出必须与测试数据的输入输出完全一致,不能在程序运行时输出其他任何题目中没有要求的提示语句,例如printf(“请输入字符串”)。请删除此类无效代码。否则您的程序提交后会显示答案错误。
4.对于输入问题。后台输入均为字符串,未明确说明以“\n”结束的,不要使用’\n’、 ’\0’ 作为while的跳出条件,不要认为后台输入数据时以回车符结束(除非特别声明)
5.上机编程技巧
排序,求最大最小数,链表,大数、高精度数运算,字符串常见操作,数组常见操作,四则运算,求数的各种附属数,匹配问题,进制转换,二叉树,规划问题,最短路径问题,图联通问题,对数字进行特殊判断
1)排序算法。排序算法有快速排序、选择排序、插入排序、冒泡排序、堆排序、归并排序、桶排序等,在编程里面较为好用的当属冒泡排序,以下是一段冒泡排序的代码
//循环读入n个数到数组a中
int a[100]
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
//冒泡核心
int t;
for(int i=1;i<=n-1;i++)//n个数排序,只用n-1趟
for(int j=1;i<=n-i;j++)//从第一个数开始比较直到最后一个尚未归位的数
if(a[j]>=a[j+1])
{t=a[j];a[j]=a[j+1];a[j+1]=t}
//注意开始的位置
2)字符操作。有很多机试题目需要对字符(不是字符串)进行判断和操作,这里列举一些常用的操作和编程技巧。
判断一个字符是数字: 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’);
3)字符串操作
依据条件筛选出一个长度不定的字符串:
char *b={"scriptwang"};
int len=strlen(b);
char *a=(char *)malloc(len)
char *i=&b[0]
while(len!=0)
*a++=*b--;
len--;
free(a);
a=NULL;
char b[]={"scriptwang"};
char a[100]={'\0'};
int j=0;
int len=strlen(b);
for(int i=0;i<len;i++)
if(a[i]满足条件)
a[j]=b[i];
j++;
以下是string.h库中的常用函数
求字符串长度: int len = strlen(str);
字符串复制: strcpy();
字符串比较: strcmp();
字符串拼接: strcat();
查询字串: strchr();
查询子串: strstr();
4)记录数组原位置并进行交换处理的问题。
https://blog.csdn.net/csdn_kou/article/details/79673699这丫的,用了四种方法。。牛皮
两组数组进行交换,在这里只说核心的思想
方法1:用for循环将整个数组元素进行交换
int a[10],b[10];
for(int i=0;i<10;i++)
{
a[i]=a[i]+b[i];
b[i]=a[i]-b[i];
a[i]=a[i]-b[i];
}
方法2:写个子函数
for(int i=0;i<10;i++)
swap(&a[i],&b[i]);
int swap(*n,*m)
{
int c;
c=*n;
*n=*m;
}
方法3:引入第三个数组
int c[10];
for(int i=0;i<10;i++)
c[i]=a[i];
for(int i=0;i<10;i++)
a[i]=b[i];
for(int i=0;i<10;i++)
b[i]=c[i];
方法4:利用strcpy
char str1[10];
char str2[10];
char str3[10];
strcpy(str3,str1);
strcpy(str1,str2);
strcpy(str2,str3);
5)排序函数
================================================================================================
(分割线)
最后,就是在华为在线机式上不断地重复刷题即可https://www.nowcoder.com/ta/huawei
1)字符串最后一个单词的长度
#include<stdio.h>
#include<string.h>
int main()
{
int len = 0;
char c;
while( (c = getchar()) != '\n' )//一个字符一个字符输入,一个字符一个字符判断
{
if( c == ' ' )
len = 0;
else
len++;
}
printf( "%d\r\n", len );
return 0;
}
2)写出一个程序,接受一个由字母和数字组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int main()
{
char s[1000];
char c;
gets(s);
c=getchar();
int i=0,num=0;
while(s[i]!='\0')
{
if(c==s[i])
num++;
else if((c >= 'A' && c <= 'Z')&&(c==s[i]-32))
num++;
else if((c >= 'a' && c <= 'z')&&(c==s[i]+32))
num++;
i++;
}
printf("%d\n",num);
return 0;
}
3.