华为笔试总结--done
记一次华为机试

记⼀次华为机试介绍华为机试分为 3 题,两题 100 分,⼀题 200 分,压线 150 分算你过,时间150分钟,⽀持多语⾔环境(⽜客⽹),考试时需全程打开摄像头,电脑屏幕分享,⼿机打开某⼩程序(可⽤计算器)不退出,可⽤本地 IDE, 会有⼀些测试题给你熟悉环境预热的。
备注: 由于脑容量有限,题⽬具体的描述笔者已经记不清了,但是⼀些考点还是记忆犹新,遂记录分享下。
做机考这⼏点很重要, 第⼀点是你要看明⽩它的输⼊输出是什么? 第⼆点是要快,⽐如说你明知道有现成的意⼤利炮可以轰它,咱就不要⾃⼰造个⼟炮了,挺浪费时间的,毕竟机考的本质其实是刷⼈, 第三点就是⼼态⼀定要好,你会做的你要尽量 100%把它做出来,遇到不会的智商题,那也就听天由命了。
消消乐(字符串)描述给定⼀个只包含⼤⼩写字母的字符串(⼤⼩写敏感),若相邻两个元素相等则消除,直到最后字符串消除不了了,输出消消乐后字符串的长度,若遇到⾮⼤⼩写字母以外的字符,则输出0。
⽰例输⼊: mMbccbc输出: 3解释:cc消掉,然后bb消掉,最后剩余mMc,输出长度3题解这⾥我是把⼀些特殊情况单独拎出来处理,然后创建了⼀个字符串res去存最后得到的字符串,然后输出其长度。
const readline = require('readline');const rl = readline.createInterface({input: process.stdin,output: process.stdout,});rl.on('line', function (line) {console.log(solution(line.trim()));});function solution(str) {if (/[^a-zA-Z]/.test(str)) {return 0;}if (str.length === 1) {return 1;}if (str.length === 2) {if (str[0] === str[1]) {return 0;} else {return 2;}}let res = '';let cur = 0;for (let i = 0; i < str.length - 1; i++) {if (str[i] === str[i + 1]) {i++;} else {if (res.length > 0 && res[res.length - 1] === str[i]) {res = res.slice(0, res.length - 1);} else {res += str[i];}}cur = i;}cur = cur + 1;if (str[cur]) {if (res[res.length - 1] === str[cur]) {res = res.slice(0, res.length - 1);} else {res += str[cur];}}return res.length;}矩阵最⼤值(⼆维矩阵)描述给定⼀个n*n的只包含0和1的⼆维矩阵,请你计算出该矩阵的最⼤值。
华为笔试经验(精选5篇)

华为笔试经验(精选5篇)华为笔试经验(精选5篇)笔试经验是指可以帮助应聘者通过HR专门编制的知识、专业技术水平和文字运用能力的书面考试的技巧和经验。
笔试经验是应聘者亲身经历笔试之后进行的归纳与分析,使之系统化、理论化。
以下是小编帮大家整理的华为笔试经验,感兴趣的一起来看看吧。
华为笔试经验1 一、IP网络基础1、路由交换(数通)基础知识。
2、网络基本概念、IP网络构架、标准化组织与协议。
3、OSI、TCP/IP协议模型结构、各个层次的功能以及报文封装。
4、IPv4子网划分。
5、ARP原理。
6、TCP/UDP原理。
7、数据转发过程。
8、常用应用层协议FTP、DHCP的工作原理。
9、Ping,Tracert,Telnet等常用工具原理与应用。
二、局域网技术1、以太网技术、交换机基本原理。
2、STP、RSTP、VLAN、GARP GVRP以及WLAN基本原理以及在VRP中的实现。
3、如何使用STP、RSTP、VLAN、GARP GVRP以及WLAN等技术以及华为交换机构建小型交换网络。
三、广域网技术1、静态路由协议原理、RIP协议基本原理、OSPF协议基本原理以及在VRP 中的实现。
2、如何使用路由技术以及华为路由器构建小型路由网络。
四、网络安全1、AAA工作原理。
2、ACL原理以及在华为路由设备中的配置。
3、GRE原理以及在华为路由设备中的配置。
4、如何利用网络安全技术保证网络安全性。
华为笔试经验2 10月9号华为来学校宣讲,下午收到笔试通知,10号上午10点笔试,笔试分两部分,共一个小时。
舍友也都收到了,大家时间不一样。
她们都是在下午。
听说总共笔试两天。
晚上宿舍一起开始准备笔试,在应届生上找会计财务管理类的笔经,发现题目考的比较杂,点比较细,因为是上机考试所以大家的题目可能都不太一样。
所以就洗洗睡了。
10号上午提前半个小时到考场,发现上一批考试的人到10点还是没有出来,我们开始自觉排队。
考场的人出来一个我们进去一个,交身份证给hr看一下,然后给你两个账号密码。
华为笔试题--doneWord版

试题选择题1、以下程序的输出结果是: 2 0 \r\n 正确值2 0 \r转义符:回车, \n转义符:换行#include <stdio.h>int main(){int n = 4;while (n--){printf("%d ", --n);}printf("\r\n");return 0;}2、设有以下宏定义:#define N 4#define Y(n) ((N+1)*n)则执行语句:Y(5+1)为: 26 如果#define Y(n) ((N+1)*(n)) 则Y(5+1) 为303、enum ENUM_A{x1,y1,z1 = 5,a1,b1};enum ENUM_A enumA = y1;enum ENUM_A enumB = b1;请问enumA和enumB的值是多少?1 7 x1=0,y1=1,a1=6,b1=74、若有函数max(a,b),并且函数指针变量p已经指向函数,当调用该函数时正确的调用方法是: (*p)(,)5、对栈S进行下列操作:push(1), push(5), pop(), push(2), pop(), pop(), 则此时栈顶元素是:NULL6、在一个32位的操作系统中,设void *p = malloc(100),请问sizeof(p)的结果是:47、若已定义: int a[9], *p = a;并在以后的语句中未改变p的值,不能表示a[1]地址的表达式是: C a的值不能改变A)p+1 B)a+1 C) a++ D) ++p8、设有如下定义:unsigned long plArray[] = {6,7,8,9,10};unsigned long *pulPtr;则下列程序段的输出结果是什么? DpulPtr = plArray;*(pulPtr + 2) += 2;printf("%d, %d\r\n", *pulPtr, *(pulPtr + 2));A) 8, 10 B) 6, 8 C) 7, 9 D) 6, 109、以下程序运行后,输出结果是什么? Cvoid main(){char *szStr = "abcde";szStr += 2;printf("%1u\r\n", szStr);return;}A) cde B) 字符c的ASCII码值 C) 字符c的地址 D) 出错10、给出以下定义:char X[] = "hello"; \0char Y[] = {'h', 'e', 'l', 'l', 'o'};则正确的叙述为: CA)数组X和数组Y等价 B) 数组X和数组Y的长度相同C) 数组X的长度大于数组Y的长度 D) 数组X的长度小于数组Y的长度11、在32位X86下,有下列程序#include <stdio.h>void main(){union{int k;char i[2];} *s, a;s = &a;s->i[0] = 0x39;s->i[1] = 0x38;printf("%x\r\n", a.k);}输出结果是:B 编译后的结果为CCCC3839,答案AA) 3839 B) 3938 C) 380039 D) 不可预知12、有如下函数定义:unsigned long MyFunc(unsigned long ulKey){return (((ulKey & 0x000000ffUL) << 24) |((ulKey & 0x0000ff00UL) << 8) |((ulKey & 0x00ff0000UL) >> 8) |((ulKey & 0xff000000UL) >> 24));}则MyFunc(0x12345678)的返回值是: CA) 0x12345678 B) 0x87654321 C) 0x78563412 D) 0x1256347813、((a>b)?a:b)代表什么含义:bA) 代表a,b之中较小的那个值B) 代表a,b之中较大的那个值C) 代表a是否比b大D) 语法错误14、某系统总线的一个总线周期包含3个时钟周期,每个总线周期可以传送32位数据。
华为机试题目总结(程序篇)

自己写的,水平很挫,仅供参考目录1.语言识别问题2.销售网络问题(未完成)3.股票投资问题4.判断手机号码合法性5.元音字母复制6.验证身份证号7.选秀节目打分8.数组最大值放中间,其他依次放其左右(规律未找着,未完成)9.任务调度(解题关键,需要一个容器来承载下标跟值的一一对应关系,最好就是定义一个结构体)10.将某字符变成小写后的某个字符11.链表的逆序12.单词统计13.字符串进行转换,转换成相应的数字已知:yi er san si wu liu qi ba jiu 分别对应,对一段只含有这几种字符的字符串进行转换,转换成相应的数字14.一个数组中比平均数大的个数15.求一个数组中第一大和第二大数16.字符变成整数17.整数变字符18.判断素数问题19(1).约瑟夫环(循环列表)19(2).约瑟夫环(数学方法只能求出最后的胜利者的序号)19(3).约瑟夫环(容器实现)20.判断某个整数是回文。
即这样的,反过来还是21.判断一个字符串是不是回文22.求一个字符串中的最大回文子串,就是从n个字符开始检查是不是回文,知道m个字符符合回文,那么这个就是最大回文23.找出^n的数24.统计一个数二进制表达中的个数25.镜像反转二进制表达式,并输出十进制值26.连续字符统计27.判断一个字符串中()是否配对28.查找子字符串个数29(1).找出一个字符串中是否包含相同(包括连续的)的子字符串(要求子串长度大于等于)并输出出现频率最高的子字符串29(2)找出一个字符串中是否包含连续相同的子字符串,并输出出现频率最高的子字符串30.删除字符窜中字符数最少的字符31.关于数组的循环移位,左移为负,右移为正32.求一个二维数组每列的最小值33.两个字符串,求最长公共子串34.超大整数加法运算,大整数会用字符串或者数组来存,不过注意低位存字符前面几位,高位存后面,存到字符中应该存“”。
这边我用的是数组35.排序总结36.将一个字符串空格分隔,并倒序输出37.删除一个字符串中的某个字符串38.取出一个字符串中所有的数字,并取出所有字母39,简单的字符统计40.查找字符串中空格分隔的单词的最大长度41.二叉树的操作42.分块查找1.语言识别问题#include<iostream>using namespace std;void main(){int n,S_num=0,T_num=0,m=0;cin>>n;char ch;getchar();for(int i=0;i<n;i++){ // m=0;while(1){ ch=getchar();/* m++;if((m>3)&& (ch=='\n')){m=0;break;}*/if(ch=='\n') break;if(ch=='s'||ch=='S') S_num++;if(ch=='t'||ch=='T') T_num++;}}if(S_num<T_num) cout<<"English\n";else cout<<"Deutsch\n";}2.销售网络问题(未完成) #include<iostream>using namespace std;void main(){int n,S_num=0;cin>>n;int a[n];for(int i=0;i<n-1;i++)cin>>a[i];if(a[])for(int i=0;i<n;i++){ // m=0;while(1){ ch=getchar();/* m++;if((m>3)&& (ch=='\n')){m=0;break;}*/if(ch=='\n') break;if(ch=='s'||ch=='S') S_num++;if(ch=='t'||ch=='T') T_num++;}}if(S_num<T_num) cout<<"English\n";else cout<<"Deutsch\n";}3.股票投资问题#include<iostream>using namespace std;void main()int B,C=0,D=0,E=0,i,j,k,l,n,m;int A;int a[12];//未来天得股价int b[12][12];cin>>B;//测试数memset(b,0,sizeof(b));//for(i=0;i<B;i++)cin>>A;for(j=0;j<12;j++)cin>>a[j];int temp=0;for(k=0;k<11;k++)for(l=k+1;l<12;l++){temp=A/a[k];b[k][l]=temp*(a[l]-a[k]);if(b[k][l]<0)b[k][l]=0;}int max=b[0][1];m=0;n=1;for(k=0;k<11;k++)for(l=k+1;l<12;l++){if(b[k][l]>max){ max=b[k][l];m=k;n=l;}if(b[k][l]==max)//相等的取购价低的{ if(a[k]<a[m]){ max=b[k][l];m=k;n=l;}}}if (max==0){cout<<"IMPOSSIBLE"<<endl;}else{C=m+1;D=n+1;E=max;cout<<C<<" "<<D<<" "<<E<<endl;}4.判断手机号码合法性#include<iostream>using namespace std;int verifyMsisdn(char* inMsisdn){int n=0;int i=0;int j=0;char *p;p=inMsisdn;while(p[i]!='\0'){ i++;n++;}if(n!=13)return 1;else{while(p[j]!='\0'){if(!((p[j]>='0' && p[j]<='9'))){return 2;break;}j++;}if(!(p[0]=='8'&& p[1]=='6'))return 3;else return 0;}}{char a[20];cin>>a;int m=verifyMsisdn(a);cout<<m;}5.元音字母复制#include<iostream>using namespace std;void sortVowel (char* input){ int j=0;char output[50]={0};for(int i=0;input[i]!='\0';i++){ if(input[i]=='a' || input[i]=='e'|| input[i]=='i'|| input[i]=='o'|| input[i]=='u') {output[j]=input[i];j++;}}int w=j;char temp;for(int k=0;k<j-1;k++)for(int l=0;l<j-1-k;l++){if(output[l]>output[l+1]){temp=output[l];output[l]=output[l+1];output[l+1]=temp;}}for(int i=0;input[i]!=0;i++){ if( input[i]=='A'|| input[i]=='E'|| input[i]=='I'|| input[i]=='O'|| input[i]=='U') {output[j]=input[i];}}char temp2;for(int m=w;m<j-1;m++)for(int n=w;n<j-1-m;n++){if(output[n]>output[n+1]){temp2=output[n];output[n]=output[n+1];output[n+1]=temp2;}}cout<<output;}void main(){char a[50];cin.get(a,50);sortVowel(a);}6.验证身份证号#include<iostream>using namespace std;int verifyIDCard(char* input) {int n=0;int i=0;int j=0;p=input;while(p[i]!='\0'){ i++;n++;}if(n!=18)return 1;else{while(j<17){if(!((p[j]>='0' && p[j]<='9'))){return 2;break;}j++;}if(!(p[17]=='x'|| (p[17]>='0' && p[17]<='9')))return 3;else{int year=(p[6]-'0')*1000+(p[7]-'0')*100+(p[8]-'0')*10+(p[9]-'0');int month=(p[10]-'0')*10+(p[11]-'0');int day=(p[12]-'0')*10+(p[13]-'0');if(!(year>=1900 && year<=2100))return 4;else{if(!(month>=1 && month<=12))return 5;else{//能被整除且不能被整除或能被整除的年份bool ryear=(year%4==0 && year%100!=0) || (year%400==0);if(!((!ryear && day>0 && day<29)|| (ryear && day>0 && day<=29)))return 6;else{return 0;}}}}}void main(){for(int c=0;c<10;c++){char a[20];cin>>a;int m=verifyIDCard(a);cout<<m;}}7.选秀节目打分#include<iostream>using namespace std;#define N 5int total(int score[],int judge_type[],int cn){ int sum1=0,sum2=0,m=0,n=0,aver=0,totalscore=0;for(int i=0;i<cn;i++){ if(judge_type[i]=1){sum1+=score[i];m++;}else{sum2+=score[i];n++;}}if(n==0)totalscore=sum1/m;else{ totalscore=(int)(sum1/m * 0.6+sum2/n * 0.4);}return totalscore;}void main(){int score[N];int judge_type[N];for(int i=0;i<N;i++){ cout<<"输入第"<<i+1<<"个评委的类别"<<endl;cin>>judge_type[i];cout<<"输入第"<<i+1<<"个评委的分数"<<endl;cin>>score[i];}int totalscore= total(score,judge_type,N);cout<<totalscore<<endl;}8.数组最大值放中间,其他依次放其左右(规律未找着,未完成)#include<iostream>using namespace std;void sort(int input[], int n, int output[]){int i,j;int temp =0;for(i =0; i<n-1; i++)for(j =0; j<n-i-1; j++){if(input[j]>input[j+1]){temp = input[j];input[j] = input[j+1];input[j+1] = temp;}}if(n%2 ==0){for(i =0 ; i<n/2; i++){output[i] = input[2*i];}for(i =0; i<n/2; i++){output[n/2+i] = input[n-1-2*i];}}else{for(i=0; i<(n-1)/2; i++){output[i] = input[2*i+1];}output[(n-1)/2]= input[n-1];for(i = 0; i<(n-1)/2; i++){output[(n-1)/2+1+i] = input[n-3-2*i];}}for(i = 0 ; i<n; i++){printf("%d", output[i]);}printf("\n");}int main(){int input1[] = {3, 6, 1, 9, 7};int input2[] = {3, 6, 1, 9, 7, 8};int output1[5] = {0};int output2[6] = {0};sort( input1, 5,output1) ;sort(input2, 6, output2) ;}9.任务调度(解题关键,需要一个容器来承载下标跟值的一一对应关系,最好就是定义一个结构体) #include<iostream>using namespace std;struct table{ int number;int value;};void scheduler(int task[], int system_task[], int user_task[],int n){struct table *sb=(struct table *)malloc(n*sizeof(struct table));for(int i=0; i<n; i++){ sb[i].number=i;sb[i].value=task[i];}struct table temp;for(int k=0; k<n-1; k++)for(int j=0; j<n-1-k; j++){if(sb[j].value>sb[j+1].value){temp=sb[j];sb[j]= sb[j+1];sb[j+1] = temp;}}int cs=0,cu=0;for(int l=0; l<n; l++){if(sb[l].value<50){system_task[cs]=sb[l].number;cs++;}else if(sb[l].value<=255){user_task[cu]=sb[l].number;cu++;}elsecontinue;}system_task[cs]=-1;user_task[cu]=-1;free(sb);for(int m=0;m<=cs;m++){cout<<system_task[m];}printf("\n");for(int n=0;n<=cu;n++){cout<<user_task[n];}}int main(){int task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99};int n=9;int count_sys=0,count_user=0;for(int i=0;i<9;i++){if(task[i]<50)count_sys++;else if(task[i]<=255)count_user++;elsecontinue;}int *system_task=(int *)malloc(count_sys*sizeof(int)+4);int *user_task=(int *)malloc(count_user*sizeof(int)+4);scheduler(task, system_task, user_task,9);//int *p = system_task;//int *q = user_task;//////printf("%d%d\n", count_sys,count_user);// for(int i=0;i<count_sys+1;i++)// {// printf("%d", system_task[i]);// printf("\n");//// for(int i=0;i<count_user+1;i++)// {// printf("%d", user_task[i]);// }free(system_task);free(user_task);}10.将某字符变成小写后的某个字符#include<iostream>using namespace std;void TransferString(const char * pInputStr, long lInputLen, char * pOutputStr) {for(int i=0;i<lInputLen;i++){if(pInputStr[i]>='V'&& pInputStr[i]<='Z')pOutputStr[i]=pInputStr[i]+11;//('a' - 'A')-('V' - 'A');else if (pInputStr[i]>='A'&& pInputStr[i]<='U')pOutputStr[i]=pInputStr[i]+37;//('a' - 'A')+('F' - 'A');else{pOutputStr[i]=pInputStr[i];}}cout<<pOutputStr;}void main(){char *pInputStr="Axs3mWss";int n=0;while(pInputStr[n]!='\0')n++;long lInputLen=n+1;char *pOutputStr=(char *)malloc(sizeof(char)*(n+1));TransferString(pInputStr,lInputLen,pOutputStr);}11.链表的逆序#include<iostream>using namespace std;typedef struct tagListNode {int value;struct tagListNode *next;}ListNode;//要求实现函数:void converse(ListNode *head) {ListNode *p1,*p2,*p3;p1=head;p2=p1->next;while(p2){p3=p2->next;p2->next=p1;p1=p2;p2=p3;}head->next=NULL;head=p1;while(p1!=NULL){cout<<p1->value<<"->";p1=p1->next;}}void main(){ListNode *p,*head,*s;head=(ListNode*)malloc(sizeof(ListNode));p=head;int n=0,m=0;while(n<5){cin>>m;s=(ListNode*)malloc(sizeof(ListNode));s->value=m;p->next=s;p=s;n++;}head=head->next;p->next=NULL;converse(head);//p=head;//while(p!=NULL)// {// cout<<p->value<<"->";// p=p->next;//// }}12.单词统计#include<iostream>#include<string>using namespace std;struct node{//int number;int count;char a[10];};void WordStat(const char * pInputStr, char * pOutputHotWord, char * pOutputColdWord) {//cout<<sizeof(pOutputHotWord)<<endl;int i=0;char *pInputStr1=(char *)malloc(100*sizeof(char));strcpy(pInputStr1,pInputStr);//(char *)while(pInputStr1[i]!='\0'){if(pInputStr1[i]>='A' && pInputStr1[i]<='Z')pInputStr1[i]+=32;i++;}const char * split = ", .";struct node sb[10]={0};//*sb=(struct node *)malloc(10*sizeof(struct node));char *p={0};p=strtok (pInputStr1,split);int j=0;while(p!=NULL){ //sb[j].number=j;strcpy(sb[j].a,p);sb[j].count=0;j++;p=strtok (NULL,split);}for(int k=0;k<10;k++)for(int l=0;l<10;l++){if (strcmp(sb[k].a,sb[l].a)==0)sb[k].count+=1;}struct node max;struct node min;int dex1=0,dex2=0;max=sb[0];min=sb[0];for(int m=0;m<j;m++){if(sb[m].count>max.count){ max=sb[m];dex1=m;}else if((sb[m].count<min.count) &&(sb[m].count!=min.count) ) {min=sb[m];dex2=m;}}/*for(int m=0;m<j;m++){cout<<sb[m].count<<endl;cout<<sb[m].a;}*/strcpy(pOutputHotWord,sb[dex1].a);strcpy(pOutputColdWord,sb[dex2].a);cout<<"最高"<<pOutputHotWord;cout<<"最低"<<pOutputColdWord;}void main(){char pInputStr[100]={0};cin.get(pInputStr,100);char * pOutputHotWord=( char *)malloc(sizeof( char *)*100); char * pOutputColdWord=( char *)malloc(sizeof( char *)*100); memset(pOutputHotWord, 0, sizeof(pOutputHotWord)) ; memset(pOutputColdWord, 0, sizeof(pOutputHotWord)) ; WordStat(pInputStr, pOutputHotWord,pOutputColdWord);}13.字符串转换成规定数字转换成相应的数字已知:yi er san si wu liu qi ba jiu 分别对应,对一段只含有这几种字符的字符串进行转换,转换成相应的数字如:yiersansan:#include<iostream>#include<string>using namespace std;int WordStat(const char * pInputStr, char * pOutputWord){int i=0,d=0,k=0,sum=0;char *pInputStr1=(char *)malloc(100*sizeof(char));strcpy(pInputStr1,pInputStr);//(char *)char* sss[9] = {"yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};while(pInputStr1[i]!='\0'){if(pInputStr1[i]=='y' || pInputStr1[i]=='e'|| pInputStr1[i]=='w'|| pInputStr1[i]=='q'|| pInputStr1[i]=='b')d=2;if(pInputStr1[i]=='l' || pInputStr1[i]=='j')d=3;if(pInputStr1[i]=='s'){ if(pInputStr1[i+1]=='a')d=3;if(pInputStr1[i+1]=='i')d=2;}for(int j=0;j<9;j++){if(strncmp(pInputStr1+i,sss[j],d)==0)k=j+1;}sum=sum*10+k;i+=d;}return sum;}void main(){char pInputStr[100]={0};cin.get(pInputStr,100);char * pOutputWord=( char *)malloc(sizeof( char *)*100);memset(pOutputWord, 0, sizeof(pOutputWord)) ;int transver= WordStat(pInputStr, pOutputWord);cout<<transver;}14.一个数组中比平均数大的个数#include<iostream>#include<string>using namespace std;int count(int p[], int n){int sum=0,m=0;for(int i=0;i<n;i++){sum+=p[i];}int aver=sum/n;for(int j=0;j<n;j++){if(p[j]>aver)m++;}return m;}void main(){cout<<"输入个数n"<<endl;int n;cin>>n;int *a=(int*)malloc(sizeof(int)*n);for(int i=0;i<n;i++){cin>>a[i];int m=count(a,n);cout<<m;}15. 求一个数组中第一大和第二大数#include<iostream>#include<string>using namespace std;void count(int p[], int n){int max=0,smax=0,k=0;for(int i=0;i<n;i++){if(p[i]>max){ max=p[i];k=i;}}for(int j=0;j<n ;j++){if(j==k)continue;if(p[j]>smax)smax=p[j];}cout<<"最大"<<max<<endl;cout<<"二大"<<smax<<endl;}void main(){cout<<"输入个数n"<<endl;int n;cin>>n;int *a=(int*)malloc(sizeof(int)*n);for(int i=0;i<n;i++)cin>>a[i];}count(a,n);}16.字符变成整数#include<iostream>#include<string>using namespace std;int chartoint(const char * pInputStr) {int i=0,d=0,k=0,sum=0;while (pInputStr[i]!='\0'){d=pInputStr[i]-'0';sum=sum*10+d;i++;}return sum;}void main(){char pInputStr[100]={0};cin.get(pInputStr,100);int transver= chartoint(pInputStr);cout<<transver+1;}17.整数变字符#include<iostream>using namespace std;void main(){int n,i=0;cin>>n;//int m=(int)sqrt(n);char p[50]={0},s[50]={0};while(n){p[i]=n%10+'0';i++;n/=10;}p[i]='\0';int m=strlen(p);//char *s=(char *)malloc(sizeof(char)*(m+1)); for (int j = 0; j < m; j ++)s[j]=p[m-1-j];s[m]='\0';cout<<s;}18.判断素数问题#include<iostream>#include<math.h>using namespace std;void main(){int n,i=0;cin>>n;//int m=(int)sqrt(n);for(i=2;i<n;i++){if(n%i==0)break;}if(i==n)cout<<"sushu"<<endl;else{cout<<"bushisushu"<<endl;}}19.1约瑟夫环#include<iostream>using namespace std;typedef struct LNode{int data;struct LNode*link;}LNode;void jos(int n,int k,int m){LNode *p,*curr,*r;p=(LNode*)malloc(sizeof(LNode));p->data=1;//注意我是从开始的奥p->link=p;curr=p;for(int i=2;i<=n;i++){LNode *s=(LNode*)malloc(sizeof(LNode));s->data=i;s->link=curr->link;curr->link=s;curr=s;}//==============================================循环链表的建立while(--k){ r=p;p=p->link;}//======================p指向序号为k的位置int w=m;while(n--){while(--m){r=p;p=p->link;}//======================p指向序号为k的之后的m位置上cout<<p->data<<"->";r->link=p->link;p=r->link;m=w;}}void main(){jos(9,1,5);}//5->1->7->4->3->6->9->2->8->19.2约瑟夫环(数学方法只能求出最后的胜利者的序号)#include<stdio.h>int main(){int n,m,i,s = 0;printf("N M =");scanf("%d%d",&n,&m);for(i = 2; i <= n; i++){s = (s + m) % i;}printf("n The winner is %dn",s+1);}19.3约瑟夫环(容器实现)#include<vector>#include<iostream>using namespace std;const int N = 9;const int M = 5;const int k = 1;int main(int argc, char* argv[]){vector<int> ring;for(int i=0; i<N;i++)ring.push_back(i+1);vector<int>::iterator iBegin = ring.begin();vector<int>::iterator iEnd;while ( !ring.empty() ){iEnd = ring.end();if(iBegin == iEnd )iBegin = ring.begin();for(int i=1;i<M;i++){iBegin++;if(iBegin >= iEnd)iBegin = ring.begin();}cout<<*iBegin<<endl;iBegin = ring.erase(iBegin);}}20.判断某个整数是回文。
华为2020秋招笔试题(小结)

华为2020秋招笔试题(⼩结)⼀、全量字符集与已占⽤字符集输⼊描述:输⼊⼀个字符串,字符串中包含了全量字符集和已占⽤字符集,两个字符集⽤@相连。
@前的字符集合为全量字符集,@后的字符集为已占⽤字符集合。
已占⽤字符集中的字符⼀定是全量字符集中的字符。
字符集中的字符跟字符之间使⽤英⽂逗号分隔。
字符集中的字符表⽰为字符加数字,字符跟数字使⽤英⽂冒号分隔,⽐如a:1,表⽰1个a字符。
字符只考虑英⽂字母,区分⼤⼩写,数字只考虑正整形,数量不超过100,如果⼀个字符都没被占⽤,@标识符仍在,例如a:3,b:5,c:2@输出描述:可⽤字符集。
输出带回车换⾏。
⽰例1:输⼊:a:3,b:5,c:2@a:1,b:2输出:a:2,b:3,c:2说明:全量字符集为3个a,5个b,2个c。
已占⽤字符集为1个a,2个b。
由于已占⽤字符集不能再使⽤,因此,剩余可⽤字符为2个a,3个b,2个c。
因此输出a:2,b:3,c:2。
注意,输出的字符顺序要跟输⼊⼀致。
不能输出b:3,a:2,c:2。
如果某个字符已全被占⽤,不需要输出。
例如a:3,b:5,c:2@a:3,b:2,输出为b:3,c:2。
思路:这道题主要涉及是对字符串的分割,拼接。
下⾯是我⾃⼰的代码,如有改进的地⽅,欢迎提出!public class HuaWei_08_07 {public static void main(String[] args){String s="a:3,b:5,c:2@a:3,b:1";HuaWei_08_07 hua=new HuaWei_08_07();String useStr=erStrings(s);System.out.print(useStr);}public String UserStrings(String s){String[] str=s.split("@");if(str.length==1){return str[0];}Map<String,Integer> map=new HashMap<>();for(int i=0;i<str.length;i++){map=putmap( map,str[i].split(","),i);}StringBuffer buf=new StringBuffer();for(String key:map.keySet()){if(map.get(key)!=0) {buf.append(key+":"+map.get(key)+",");}}String s1=buf.toString();return s1.substring(0,s1.length()-1);}public Map<String,Integer> putmap(Map<String,Integer> map,String[] str,int flag){for(int i=0;i<str.length;i++){String s2=str[i].split(":")[0];int a=Integer.parseInt(str[i].split(":")[1]);if(flag==1&&map.containsKey(s2)){int b=map.get(s2)-a;map.put(s2,b);}else{map.put(s2,a);}}return map;}}⼆、Trie树题⽬描述:如下是⼀棵Trie树,圆圈表⽰内部节点,指向孩⼦节点的每个标记的值范围在0-255之间,每个内部节点最多有256个孩⼦节点。
华为财经笔试经验.doc

华为财经笔试经验10月9号华为来学校宣讲,下午收到笔试通知,10号上午10点笔试,笔试分两部分,共一个小时。
舍友也都收到了,大家时间不一样。
她们都是在下午。
听说总共笔试两天。
晚上宿舍一起开始准备笔试,在应届生上找会计财务管理类的笔经,发现题目考的比较杂,点比较细,因为是上机考试所以大家的题目可能都不太一样。
所以就洗洗睡了。
10号上午提前半个小时到考场,发现上一批考试的人到10点还是没有出来,我们开始自觉排队。
考场的人出来一个我们进去一个,交身份证给hr看一下,然后给你两个账号密码。
再自己找座位坐下。
下面说到正题。
笔试内容:分两部分。
第一部分是专业笔试,我们这次是30道题,时间30分钟,单选15道(其中专业单选10道,综合单选5道,不是很确定是否这个比例),不定选15道。
有几套题目可以选择,我选的是财务管理类的题目。
题目其实比较基础,考的都是一些基本的知识点,涉及较多的会计和财务知识,较少的税法,金融等。
我有4道英文题,因为专业英语不太好所以都不太会选。
回忆几个考到的知识点。
1.速动比率涉及到的账户有哪些?2.汇率的影响因素有哪些?(全选)3.票据的行为包括哪些?(全选)4.在组合投资时,综合资金成本的考虑因素有哪些?5.现金流预测时考虑哪些因素?(英文题,全选)6.经济效益综合评价法包括哪几个?a、指数体系法,b、等分评分法,c、不等分评分法,d、功效系数法。
7.应收账款的入账价值包括哪些?(全选)8.哪个机构能够制定会计的部门规章?我选的财政部。
9.一道计算题,考查营业利润的计算,很基础。
10.XX 年变动的增值税条例,下列哪个选项是这次修改变动的?(回来发现答案应该是全选)11.管理信息系统的英文简称是什么?(蒙的mis)。
还有其他的一些财务管理的知识点,不太记得了,比如说净现值、现金流量等。
总之,虽然做完题目很快,大概15分钟吧,但是我有蛮多的题目都不太确定答案。
悲催的是,回宿舍和舍友回忆时发现,不确定的选项(以上回忆的大多是不确定的选项,确定的没印象了)如果全选基本都是对的。
华为历年笔试题大汇总
2010校园招聘笔试题目分享 (1)应聘华为各类工程师通信基础题库以及答案 (1)华为资金管理岗笔试 (10)华为厦门销售融资岗笔试 (12)华为财经笔试 (12)华为会计笔试 (12)华为软件工程师笔试题 (13)华为硬件笔试题 (17)研发〔软件〕 (18)武汉华为笔试归来〔财经类资金管理销售融资岗〕 (19)2008-2009校园招聘笔试题目分享 (20)华为笔试 (20)华为笔试回来 (21)华为的C语言笔试题 (22)华为C/C++笔试题 (23)2010校园招聘笔试题目分享应聘华为各类工程师通信基础题库以及答案电信基础知识题库〔以下题目可以按填空、判断或简答方式出题,也可以经过变化成为选择题〕1、语音信号数字化过程中,采用的是的量化方法是非均匀量化。
2、PCM30/32路系统中,每个码的时间间隔是488ns。
3、PCM30/32路系统中,TS0用于传送帧同步信号,TS16用于传送话路信令。
4、PCM30/32路系统中,复帧的重复频率为500HZ,周期为2ms。
5、程控交换机的硬件可分为话路系统和中央控制系统两部分,整个交换机的控制软件都放在控制系统的存储器中。
6、一般二氧化硅光纤的零色散波长在1310nm左右,而损耗最小点在1550nm波长左右。
7、G.652光纤是零色散波长在1310nm的单模光纤。
8、光缆的基本结构由缆芯、加强元件和护套组成。
9、常用的光缆结构形式有层绞式光缆、束管式光缆、骨架式光缆和带状式光缆。
10、在网状网的拓扑结构中,N个节点完全互连需要N〔N-1〕/2条传输线路。
11、在星型网的拓扑结构中,N个节点完全互连需要N-1条传输线路。
12、ATM技术是电路交换技术和分组交换技术的结合。
13、根据98年发布的《自动交换〔数字〕网技术体制》,我国网分为三级。
14、根据新的网体制,我国长途网分为二级。
15、当网全网为三级时,两端局之间最大的串接电路段数为5段,串接交换中心最多为6个。
华为技术招聘笔试题解析(上)
华为技术招聘笔试题解析(上)2023年了,现在的科技领域越来越被关注,尤其是华为公司,一直在领导着行业的创新。
华为一向以高强度的技术研发和优秀的员工培养而著名,而在2023年前不久,华为技术招聘又吸引了许多优秀的人才。
此次招聘不仅吸引了部分学术界的精英,也吸引了大量的行业人才。
招聘需要经过笔试,今天我们就来分析一下华为技术招聘笔试题解析(上)。
华为的笔试对于应聘者的知识面要求相当高,涵盖了电路,信号处理,控制论,计算机基础,数学等等多个领域。
在这次华为技术招聘笔试中,有一题相当的经典,就是“畸形”问题。
这道题的核心代表了华为一贯的风格,即追求创新,不断引领科技潮流。
这题难度比较大,我们一起来看看吧。
题目描述:在一个公司中,有多个部门以及各个部门的上司和下属之间的关系,已知这些关系,编写一个程序判断是否存在“畸形”——指上司赋予下属的责任并不唯一。
为简单起见,假定每位员工只会有一个上司,并且员工之间的关系是一个树形结构,即一个员工只有一个上司,但可以有多个下属。
这道题目考察了对树形结构的理解以及递归操作的实现。
用最容易想到的方法,循环遍历每个节点,并比较它的上司节点是否存在前面出现的上司节点中。
这种方法看起来缓慢,但是我们可以进行部分优化。
任务是判断是否存在畸形。
那么我们应该回答这个问题的方法是要在整颗树上进行判断。
根据这个思路,我们可以采取递归的方式来遍历树,依次判断所有节点的上司节点是否已经出现过。
在遍历过程中,我们使用一个 HashSet 存储已经遍历过的上司节点。
如果一个下属的上司已经在 HashSet 中出现过,那么说明这个上司出现了两次,也就是这个节点存在两个上司节点,这时就可以结束遍历。
如果整颗树都没有发现畸形,那么递归结束后,函数返回 false。
通过上面的思路介绍,我们可以来看一下完整的代码实现。
public static boolean isExistAbnormalEmployee(Employee employee) {if (employee == null) {return false;}Set<Employee> set = new HashSet<>();return isExistAbnormalEmployee(employee, set);}private static boolean isExistAbnormalEmployee(Employee employee, Set<Employee> set) {if (employee == null) {return false;}if (!set.add(employee.getSuperEmployee())) {return true;}returnisExistAbnormalEmployee(employee.getSuperEmployee(), set)||isExistAbnormalEmployee(employee.getSubordinates(), set);}其中 Employee 类型代表公司中的员工,包括一个上司和多个下属。
华为笔试到终面经验
华为笔试到终面经验贴本人大概情况:本科,会计学院,专业就不说了。
单论学习成绩在班上只算中等,拿过两次奖学金,做过班委,但是没在学生会做过,没有三下乡,参加比赛也从未获过奖,啥科研立项的更是没有,没有在名企实习过,只在一家小企业实习过几周,英语过6级,500+,口语还行。
华为简历打印出来只有一页多一点,别人打印出来的简历两页满的,甚至有三页的都很多。
本人是本科但是华为比较看重研究生这个在后面的情况中会介绍到面试流程是:笔试---->一面(一对一)--->二面(群面)--->终面(BOSS面)这个帖子就按照这个流程讲我的经历一。
笔试华为笔试是上机考试,25道选择题,包括单选、多选和判断。
一题4分,满分100分,考试完了马上就可以看到自己的成绩,不过不用担心,笔试成绩只有三四十分一般也会给你面试的机会,有同学说笔试不刷人,但不是说笔试就没用了。
因为他不会只凭成绩就否定掉你,还是比较人性,但是到后面的时候会综合考虑你的成绩,如果你面试得不好笔试成绩也不好,那就没说了,如果你面试差点,但是成绩很好,那肯定比同样表现不好的人有优势。
笔试的内容涵盖财管、会计、税法,不过都是一些很基础的问题,但是如果像我一样平时学得不扎实,很多问题回答的还是会没把握。
还有一些课本以外的题目,比如说什么新加坡存款利息的一个税率是多少,这个的正确率就凭各人的RP了。
另外,上机的试题每个人不一样,有的人偏重税务一点,计算的会比较多(但是不难),有的人偏重会计的一点,对概念的把握会比较多。
本人专业学得并不好,假期也没有复习CPA,很多题目都不确定(很惭愧果然平时不踏实学习吃亏的还是自己)考得比较烂,觉得很多答案都不确定,最后成绩是60分,笔试的人中最高分是76分,貌似是一个学税务的同学(会计的同学要有危机感啊)。
二。
一面笔试完了之后,步行到银河王朝酒店,等待一面。
一面的面试官都是财务部的小头头,而不是一般的HR。
前面说了一面是一对一的面试,面试我的是一个胖胖的GG,左手无名指上的戒指很显眼,看起来挺和蔼的。
华为招聘笔试题汇总【最全面】
一、单项选择题1.Java是从()语言改进重新设计。
A.AdaB.C++C.PasacalD.BASIC答案:B2.下列语句哪一个正确()A.Java程序经编译后会产生machine codeB.Java程序经编译后会产生byte codeC.Java程序经编译后会产生DLLD.以上都不正确答案:B3.下列说法正确的有()A.class中的constructor不可省略B.constructor必须与class同名,但方法不能与class同名C.constructor在一个对象被new时执行D.一个class只能定义一个constructor答案:C4.提供Java存取数据库能力的包是()A.java.sqlB.java.awtC.ngD.java.swing答案:A5.下列运算符合法的是()A.&&B.<>C.ifD.:=答案:A6.执行如下程序代码a=0;c=0; do{ --c; a=a-1; }while(a>0); 后,C的值是()A.0 B.1 C.-1 D.死循环答案:C7.下列哪一种叙述是正确的()A.abstract修饰符可修饰字段、方法和类B.抽象方法的body部分必须用一对大括号{ }包住C.声明抽象方法,大括号可有可无D.声明抽象方法不可写出大括号答案:D8.下列语句正确的是()A.形式参数可被视为local variableB.形式参数可被字段修饰符修饰C.形式参数为方法被调用时,真正被传递的参数D.形式参数不可以是对象答案:A9.下列哪种说法是正确的()A.实例方法可直接调用超类的实例方法B.实例方法可直接调用超类的类方法C.实例方法可直接调用其他类的实例方法D.实例方法可直接调用本类的类方法答案:D二、多项选择题1.Java程序的种类有()A.类(Class)B.AppletC.Application D.Servlet2.下列说法正确的有()A.环境变量可在编译source code时指定B.在编译程序时,所能指定的环境变量不包括class pathC.javac一次可同时编译数个Java源文件D.javac.exe能指定编译结果要置于哪个目录(directory)答案:BCD3.下列标识符不合法的有()A.new B.$UsdollarsC.1234 D.car.taxi答案:ACD4.下列说法错误的有()A.数组是一种对象B.数组属于一种原生类C.int number=[]={31,23,33,43,35,63} D.数组的大小可以任意改变答案:BCD5.不能用来修饰interface的有()A.private B.publicC.protected D.static答案:ACD6.下列正确的有()A.call by value不会改变实际参数的数值B.call by reference能改变实际参数的参考地址C.call by reference不能改变实际参数的参考地址D.call by reference能改变实际参数的内容答案:ACD7.下列说法错误的有()A.在类方法中可用this来调用本类的类方法B.在类方法中调用本类的类方法时可直接调用C.在类方法中只能调用本类中的类方法D.在类方法中绝对不能调用实例方法答案:ACD8.下列说法错误的有()A.Java面向对象语言容许单独的过程与函数存在B.Java面向对象语言容许单独的方法存在C.Java语言中的方法属于类中的成员(member)D.Java语言中的方法必定隶属于某一类(对象),调用方法与过程或函数相同答案:ABC9.下列说法错误的有()A.能被java.exe成功运行的java class文件必须有main()方法B.J2SDK就是Java API C.Appletviewer.exe可利用jar选项运行.jar文件D.能被Appletviewer成功运行的java class文件必须有main()方法答案:BCD三、判断题1.Java程序中的起始类名称必须与存放该类的文件名相同。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/campus/1.static有什么用途?(请至少说明两种)1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。
它是一个本地的全局变量。
3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。
那就是,这个函数被限制在声明它的模块的本地范围内使用2.引用与指针有什么区别?1) 引用必须被初始化,指针不必。
2) 引用初始化以后不能被改变,指针可以改变所指的对象。
3) 不存在指向空值的引用,但是存在指向空值的指针。
3.描述实时系统的基本特性在特定时间内完成特定的任务,实时性与可靠性。
4.全局变量和局部变量在内存中是否有区别?如果有,是什么区别?全局变量储存在静态数据库,局部变量在堆栈。
静态全局变量是位于数据段并且在程序开始运行的时候被加。
程序的动态的局部变量则分配在堆栈里面。
5.什么是平衡二叉树?左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于1。
6.堆栈溢出一般是由什么原因导致的?没有回收垃圾资源。
7.什么函数不能声明为虚函数?Constructor(构造函数)函数不能声明为虚函数。
8.冒泡排序算法的时间复杂度是什么?时间复杂度是O(n^2)。
9.写出float x 与“零值”比较的if语句。
if(x>0.000001&&x<-0.000001)10.Internet采用哪种网络协议?该协议的主要层次结构?Tcp/Ip协议主要层次结构为:应用层/传输层/网络层/数据链路层/物理层。
11.Internet物理地址和IP地址转换采用什么协议?ARP (Address Resolution Protocol)(地址解析協議),实现通过IP地址得知其物理地址(MAC地址)。
12.IP地址的编码分为哪俩部分?IP地址由两部分组成,网络号和主机号。
不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位。
13.用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。
写出C程序。
循环链表#includ e <stdio.h>#includ e <stdlib.h>#includ e <conio.h>#define NULL0#define OK 1#define ERROR0#define OVERFLOW-2typedef int Status;typedef int Elemtype;/*定义数据元素类型*/typedef struct Cnode{Elemtype data;struct Cnode *next;}CNode;CNode*joseph;/*定义一个全局变量*/Status Create_clist(CNode *clist,int n){CNode *p,*q;int i;clist=NULL;for(i=n;i>=1;i--){p=(CNode *)malloc(sizeof(CNode));if(p==NULL)return OVERFLOW; /*存储分配失败*/p-> data=i;p-> next=clist;clist=p;if(i==n)q=p;/*用q指向链表最后一个结点*/}q-> next=clist; /*把链表的最后一个结点的链域指向链表的第一个结点,构成循环链表*/ joseph=clist; /*把创建好的循环链表头指针赋给全局变量*/return OK;} /*end */Status Joseph(CNode *clist,int m,int n,int k){int i;CNode *p,*q;if(m> n) return ERROR;/*起始位置错*/if(!Create_clist(clist,n))return ERROR; /*循环链表创建失败*/p=joseph; /*p指向创建好的循环链表*/for(i=1;i <m;i++)p=p-> next; /*p指向位置的结点*/while(p){for(i=1;i <k-1;i++)p=p-> next; /* 找出第k个结点*/q=p-> next;printf( "%d ",q-> data);/*输出应出列的结点*/if(p-> next==p)p=NULL; /*删除最后一个结点*/else{ p-> next=q-> next;p=p-> next;free(q);}} /*while */clist=NULL;} /* end */int main(){int m,n,k,i;CNode *clist;clist=NULL;/*初始化clist */printf( "\n请输入围坐在圆桌周围的人数n:");cin>>n;printf( "\n请输入第一次开始报数人的位置m: ");cin>>m;printf( "\n你希望报数到第几个数的人出列? ");cin>>k;;Create_clist(clist,n);/*创建一个有n个结点的循环链表clist */printf( "\n出列的顺序如下?:\n ");Joseph(clist,m,n,k);cin.get();return 0 ;} /*main */14.不能做switch()的参数类型是:switch的参数不能为实型(实数或浮点数)。
15.上海华为的一道关于指针方面的编程题:int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize),使A把0移至后面,非0整数移至数组前面并保持有序,返回值为原数据中第一个元素为0的下标。
(尽可能不使用辅助空间且考虑效率及异常问题,注释规范且给出设计思路)#includ e<iostream>#define nsize 18using namespace std;int Func(int* A, int nSize){int i,k,t=1,flag=0;for(i=0;i<nSize-1;i++){if(A[i]==0&&flag==0){k=i;//记录第一个零的下标flag=1;}if(A[i]==0&&A[i+1]!=0){A[i+1-t]=A[i+1];A[i+1]=0;}else if(A[i]==0&&A[i+1]==0){t++;//记录0的个数}}return k;}int main(){int a[nsize]={1,2,3,4,0,5,7,0,7,5};cout<<Func(a,nsize)<<endl;for(int i=0;i<nsize;i++)cout<<a[i]<<" ";cin.get();return 0 ;}16.写一个程序, 要求功能:求出用1,2,5这三个数不同个数组合的和为100的组合个数。
如:100个1是一个组合,5个1加19个5是一个组合。
请用C++语言写。
答案:最容易想到的算法是:设x是1的个数,y是2的个数,z是5的个数,number是组合数,注意到0<=x<=100,0<=y<=50,0<=z=20,所以可以编程为:number=0;for (x=0; x<=100; x++)for (y=0; y<=50; y++)for (z=0; z<=20; z++)if ((x+2*y+5*z)==100)number++;cout<<number<<endl;上面这个程序一共要循环100*50*20次,效率实在是太低了。
事实上,这个题目是一道明显的数学问题,而不是单纯的编程问题。
我的解法如下:因为x+2y+5z=100,所以x+2y=100-5z,且z<=20 x<=100 y<=50,所以(x+2y)<=100,且(x+5z)是偶数,对z 作循环,求x的可能值如下:z=0, x=100, 98, 96, 0z=1, x=95, 93, ..., 1z=2, x=90, 88, ..., 0z=3, x=85, 83, ..., 1z=4, x=80, 78, ..., 0......z=19, x=5, 3, 1z=20, x=0因此,组合总数为100以内的偶数+95以内的奇数+90以内的偶数+...+5以内的奇数+1,即为:(51+48)+(46+43)+(41+38)+(36+33)+(31+28)+(26+23)+(21+18)+(16+13)+(11+8)+(6+3)+1,某个偶数m以内的偶数个数(包括0)可以表示为m/2+1=(m+2)/2,某个奇数m以内的奇数个数也可以表示为(m+2)/2,所以,求总的组合次数可以编程为:number=0;for (int m=0;m<=100;m+=5){number+=(m+2)/2;}cout<<number<<endl;这个程序,只需要循环21次, 两个变量,就可以得到答案,比上面的那个程序高效了许多倍----只是因为作了一些简单的数学分析,这再一次证明了:计算机程序=数据结构+算法,而且算法是程序的灵魂,对任何工程问题,当用软件来实现时,必须选取满足当前的资源限制,用户需求限制,开发时间限制等种种限制条件下的最优算法。
而绝不能一拿到手,就立刻用最容易想到的算法编出一个程序了事——这不是一个专业的研发人员的行为。
那么,那种最容易想到的算法就完全没有用吗?不,这种算法正好可以用来验证新算法的正确性,在调试阶段,这非常有用。
在很多大公司,例如微软,都采用了这种方法:在调试阶段,对一些重要的需要好的算法来实现的程序,而这种好的算法又比较复杂时,同时用容易想到的算法来验证这段程序,如果两种算法得出的结果不一致(而最容易想到的算法保证是正确的),那么说明优化的算法出了问题,需要修改。
可以举例表示为:#ifdef DEBUGint simple();#end ifint optimize();......in a function:{result=optimize();ASSERT(result==simple());}这样,在调试阶段,如果简单算法和优化算法的结果不一致,就会打出断言。