华为上机准备

其它的请参考: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.

猜你喜欢

转载自blog.csdn.net/u011436427/article/details/81489804