华为od机考准备记录

应该没啥人看,就是个菜鸡的自我记录贴。

考研失败了找工作,想起了曾经联系过我的华为od hr,联系之后对方很善良的表示能给时间让我学好了再机考面试,不知道别人学习要多久,懵逼的学了一个多月还是觉得自己啥都不懂,但还是勉强继续学吧。

约等于零基础从头学c语言再准备机考了,网上好多代码解答都是c++或java做的,我试试用c好了,暂时懒得重新学一门语言了。

PS:本人菜鸡一枚,给出的代码有时候随着学习会反应过来有些地方特别蠢,但是懒得改,看到很笨的解法勿喷(主要是数据结构和算法学得太菜了)。由于我也没有用例库,代码只保证示例通过,不确定是不是百分百通过,欢迎大佬交流指正。

4.17

1.快递运输

一辆运送快递的货车,运送的快递均放在大小不等的长方体快递盒中,为了能够装载更多的快递,同时不能让货车超载,需要计算最多能装多少个快递。

注:快递的体积不受限制,快递数最多1000个,货车载重最大50000。

输入描述:

第一行输入每个快递的重量,用英文逗号分隔,如:5,10,2,11

第二行输入货车的载重量,如:20

不需要考虑异常输入。

输出描述:

输出最多能装多少个快递,如:3

示例1:

输入

5,10,2,11

20

输出

3

说明

货车的载重量为20,最多只能放三个快递5、10、2,因此输出3

#include
int main()
{
	int arr[100]={0};
	int i=0,j=0,sum=0;
	int n=0;
    int temp,k;
	while(scanf("%d,",&arr[i])!=EOF)
	{
		i++;
		n++;
	}
    k=arr[n-1];
    for(i=0;iarr[j])
    		{
    			temp=arr[j];
    			arr[j]=arr[i];
    			arr[i]=temp;
			}
		}
	}
	for(i=0;ik)
		printf("%d",i);
	}
}

    很笨的办法,之前一直在查有逗号分隔的数据怎么录入数组,然后看到这么简单可以录入,但是不知道为什么换行仍然继续录入了货车载重量k,不想探究了,直接赋值,就这样吧。

5.8

2.勾股元组数

如果三个正整数A B C ,A²+B²=C²则为勾股数
        // 如果ABC之间两两互质,即A与B A与C B与C均互质没有公约数,
        // 则称其为勾股数元组。
//        请求出给定n m 范围内所有的勾股数元组
//        输入描述
//          起始范围 1 //        输出目描述
//           abc 保证a //           多组勾股数元组 按照a升序b升序 c升序的排序方式输出。
//           给定范围内,找不到勾股数元组时,输出  Na

        // 案例
        //  输入
        //   1
        //   20
        //  输出
        //   3 4 5
        //   5 12 13
        //   8 15 17

        //  输入
        //    5
        //    10
        //  输出
        //    Na
 

#include
int gcd(int a,int b)
{
    while(a%b)
    {
        int temp=a;
        a=b;
        b=temp%b;
    }
    return b;
}
int main()
{
    int n,m,i,j,k,count=0;
    scanf("%d %d",&n,&m);
    for(i=n;i

3.整数对最小和 

给定两个整数数组
        //array1 array2  数组元素按升序排列
        // 假设从arr1 arr2中分别取出一个元素,可构成一对元素
        // 现在需要取出k对元素,并对取出的所有元素求和
        // 计算和的最小值
        // 注意:两对元素对应arr1 arr2的下标是相同的
        //       视为同一对元素

        //输入描述
        //    输入两行数组arr1 arr2
        //    每行首个数字为数组大小size   0         //    arr1,2中的每个元素   0< <1000
        //    接下来一行  正整数k   0         // 输出描述
        //   满足要求的最小值

        // 例子

        //输入
        //   3 1 1 2
        //   3 1 2 3
        //   2

        //输出
        //   4

        //说明:用例中需要取两个元素,
        // 取第一个数组第0个元素与第二个数组第0个元素组成一个元素
        // [1,1]
        //取第一个数组第1个元素与第二个数组第0个元素组成一个元素
        // [1,1]

        //求和为1+1+1+1=4 ,满足要求最小

#include
int main()
{
    int i,j,k,n,m,t=0,sum=0;
    int arr1[100]={0},arr2[100]={0},arr3[10000]={0};
    scanf("%d ",&n);
    for(i=0;iarr3[j])
            {
                int temp=arr3[i];
                arr3[i]=arr3[j];
                arr3[j]=temp;
            }
        }
    }
    for(i=0;i

4.n阶方阵和

这道题做法纯属讨巧懒得写了……尽量不要学

 给出n阶方阵里所有数
        求方阵里所有数的和
        输入描述:
          输入有多个测试用例
          每个测试用例第一个第一个整数n   n<=1000 表示方阵阶数为n
          接下来是n行的数字,每行n个数字用空格隔开
        输出描述:
          输出一个整数表示n阶方阵的和
        例子:
          输入
              3
              1 2 3
              2 1 3
              3 2 1
          输出
              18
 

#include
int main()
{
   int n,sum=0,i,a;
    scanf("%d",&n);
    for(i=0;i

 5.GPU 算力

 为了充分发挥Gpu算力,
         需要尽可能多的将任务交给GPU执行,
         现在有一个任务数组,
         数组元素表示在这1s内新增的任务个数,
         且每秒都有新增任务,
         假设GPU最多一次执行n个任务,
         一次执行耗时1s,
         在保证Gpu不空闲的情况下,最少需要多长时间执行完成。

         输入描述
           第一个参数为gpu最多执行的任务个数
           取值范围1~10000
           第二个参数为任务数组的长度
           取值范围1~10000
           第三个参数为任务数组
           数字范围1~10000

         输出描述
           执行完所有任务需要多少秒

         例子
           输入
            3
            5
            1 2 3 4 5
           输出
            6

            说明,一次最多执行3个任务  最少耗时6s

          例子2
            输入
             4
             5
             5 4 1 1 1
            输出
             5

           说明,一次最多执行4个任务  最少耗时5s
         */
 

#include
int main()
{
  int n,i,j,k,m;
    int arr[10000]={0};
    scanf("%d",&n);
    scanf("%d",&m);
    for(i=0;i

6.身高排序

小明今年升学到了小学1年纪
         来到新班级后,发现其他小朋友身高参差不齐
         然后就想基于各小朋友和自己的身高差,对他们进行排序
         请帮他实现排序
         输入描述
          第一行为正整数 h和n
          0           0           第二行为n各正整数
           h1 ~ hn分别是其他小朋友的身高
         取值范围0          且n个正整数各不相同

         输出描述
          输出排序结果,各正整数以空格分割
          和小明身高差绝对值最小的小朋友排在前面
          和小明身高差绝对值最大的小朋友排在后面
          如果两个小朋友和小明身高差一样
          则个子较小的小朋友排在前面

          示例一
          输入
          100 10
          95 96 97 98 99 101 102 103 104 105
          输出
           99 101 98 102 97 103 96 104 95 105

#include
#include
int main()
{
    int h,n,i,j,k,min;
    int a[50]={0};
    int a1[50]={0};
    int cha[200]={0};
    scanf("%d %d",&h,&n);
    for(i=0;i0)
            {
                 int x=abs (h-cha[j]);
                
                if(k>x)
                {
                    k=x;
                    min=j;
                }
            }      
        }
        cha[min]=201;
        a1[i]=min;
    }
    for(i=0;i

7.购物问题

双11众多商品进行打折销售,小明想购买一些自己心意的商品
    但由于受购买资金限制,所以他决定从众多心意商品中购买3件
    而且想尽可能的花完资金
    现在请你设计一个程序帮助小明计算尽可能花费的最大资金额

    输入描述
     第一行为整型数组M 数组长度小于100 数组元素记录单个商品的价格
     单个商品价格<1000
     第二行输入为购买资金的额度R
     R<100000

    输出描述
     输出为满足上述条件的最大花费额度
     如果不存在满足上述条件的商品请返回-1

    例子1
    输入
     23,26,36,27
     78
    输出
     76
 

此题题解同第一题货车运输问题一样,就懒得打了,最大的问题也是……我还搞不懂逗号怎么略过。

8.字符串排序

给定两个字符串
        从字符串2中找出字符串1中的所有字符
        去重并按照ASCII码值从小到大排列
        输入字符串1长度不超过1024
        字符串2长度不超过100

        字符范围满足ASCII编码要求,按照ASCII由小到大排序

        输入描述:
         bach
         bbaaccddfg
         输出
          abc

          2
          输入
          fach
          bbaaccedfg
          输出
          acf
 

#include
#include
int main()
{
    char s1[1000],s2[100];
      int i,j;
    scanf("%[^\n]\n",s1);   
    scanf("%[^\n]",s2);
    int len1=strlen(s1);
    int len2=strlen(s2);
    int key[128]={0};
  
    for(i=0;i

9.按索引范围翻转文章片段

    输入描述
     使用换行隔开3个参数
     第一个参数为文章内容 即英文字符串
     第二个参数为翻转起始单词下标,下标从0开始
     第三个参数为结束单词下标

     输出描述

     翻转后英文文章片段每个单词之间以一个半角空格分割输出

     例子

      输入
       I am a developer.
       0
       3
      输出
       I a am developer.

      输入
        hello world!
      0
      3
      输出
      world! hello
 

惭愧……这道题连题目要求都看不懂,等懂了再看看能不能写得出来,目测不算难。

10.内存资源分配

有一个简易内存池,内存按照大小粒度分类
    每个粒度有若干个可用内存资源
    用户会进行一系列内存申请
    需要按需分配内存池中的资源
    返回申请结果成功失败列表
    分配规则如下
    1.分配的内存要大于等于内存的申请量
    存在满足需求的内存就必须分配
    优先分配粒度小的,但内存不能拆分使用
    2.需要按申请顺序分配
    先申请的先分配,有可用内存分配则申请结果为true
    没有可用则返回false
    注释:不考虑内存释放

    输入描述
    输入为两行字符串
    第一行为内存池资源列表
    包含内存粒度数据信息,粒度数据间用逗号分割
    一个粒度信息内用冒号分割
    冒号前为内存粒度大小,冒号后为数量
    资源列表不大于1024
    每个粒度的数量不大于4096

    第二行为申请列表
    申请的内存大小间用逗号分割,申请列表不大于100000

    如
    64:2,128:1,32:4,1:128
    50,36,64,128,127

    输出描述
    输出为内存池分配结果
    如true,true,true,false,false

    示例一:
    输入:
    64:2,128:1,32:4,1:128
    50,36,64,128,127
    输出:
    true,true,true,false,false

    说明:
    内存池资源包含:64k共2个、128k共1个、32k共4个、1k共128个的内存资源
    针对50,36,64,128,127的内存申请序列,
    分配的内存依次是,64,64,128,null,null
    第三次申请内存时已经将128分配出去,因此输出的结果是
    true,true,true,false,false
 

#include
int main()
{
    int arr[1000][2]={0};
    int n1=0,n2=0,i=0,j,k,temp0,temp1;
    char ch;
    while(scanf("%d%*c%d%c",&arr[n1][0],&arr[n1][1],&ch))
    {
        n1++;
        if(ch!=',')
            break;
    }
    for(i=0;iarr[j][0])
            {
                temp0=arr[i][0];
                arr[i][0]=arr[j][0];
                arr[j][0]=temp0;
                temp1=arr[i][1];
                arr[i][1]=arr[j][1];
                arr[j][1]=temp1;
            }
        }
    }
    int b[1000][2]={0};
    while(scanf("%d%c",&b[n2],&ch))
    {
        n2++;
        if(ch!=',')
            break;
    }
    for(i=0;i

11.太阳能板最大面积(5.20)

给航天器一侧加装长方形和正方形的太阳能板(图中的斜线区域)
        需要先安装两个支柱(图中的黑色竖条)
        再在支柱的中间部分固定太阳能板
        但航天器不同位置的支柱长度不同
        太阳能板的安装面积受限于最短一侧的那支支柱的长度

        现提供一组整型数组的支柱高度数据
        假设每个支柱间的距离相等为一个单位长度
        计算如何选择两根支柱可以使太阳能板的面积最大

        输入描述
        10,9,8,7,6,5,4,3,2,1
        注释,支柱至少有两根,最多10000根,能支持的高度范围1~10^9的整数

        柱子的高度是无序的
        例子中的递减是巧合

        输出描述
        可以支持的最大太阳板面积:(10m高支柱和5m高支柱之间)
        25

        示例1
        输入
        10,9,8,7,6,5,4,3,2,1
        输出
        25
        备注 10米高支柱和5米高支柱之间宽度为5,高度取小的支柱高度也是5
        面积为25
        任取其他两根支柱所能获得的面积都小于25 所以最大面积为25
 

#include
int main()
{
   int a[10000];
    int max[10000]={0};
    int i=0,j,k=1,n=0,temp=0,min;
    char ch;
    while(scanf("%d%c",&a[n],&ch))
    {
        n++;
        if(ch!=',')
            break;
    }
    for(i=0;ia[j]) 
               min=a[j];
            temp=min*k;
            if(temp>max[i])
                max[i]=temp;
            k++;
        }
    }
    int m=max[0];
    for(i=0;i

12.单词接龙

单词接龙的规则是:

用于接龙的单词首字母必须要前一个单词的尾字母相同;
当存在多个首字母相同的单词时,取长度最长的单词,如果长度也相等,则取字典序最小的单词;
已经参与接龙的单词不能重复使用。
现给定一组全部由小写字母组成单词数组,并指定其中的一个单词作为起始单词,进行单词接龙。

请输出最长的单词串,单词串是单词拼接而成,中间没有空格。

输入描述:

输入的第一行为一个非负整数,表示起始单词在数组中的索引K,0 <= K < N。
输入的第二行为一个非负整数,表示单词的个数N。
接下来的N行,分别表示单词数组中的单词。
输出描述:

输出一个字符串,表示最终拼接的单词串。
备注:

单词个数N的取值范围为[1, 20]
单个单词的长度的取值范围为[1, 30]
示例

输入:

0
6
word
dd
da
dc
dword
d
输出:

worddwordda
说明:

先确定起始单词word,再接以d开头的且长度最长的单词dword,剩余以d开头且长度最长的有dd、da、dc,则取字典序最小的da,所以最后输出worddwordda。
输入:

4
6
word
dd
da
dc
dword
d
输出:

dwordda
说明:

先确定起始单词dword,剩余以d开头且长度最长的有dd、da、dc,则取字典序最小的da,所以最后输出dwordda。
 

#include
#include
int main()
{
    int k,n,i,j;
    scanf("%d\n%d",&k,&n);
    char s1[20][30],s2[20][30];
    int len[20]={0};
    for(i=0;i1)
        {
            
            for(int c=1;c0)
                {
                        max=temp[c];                                 
                }             
            }
        }
        key[t]=max;
        t++;
        ch=s1[max][len[max]-1];
        s1[max][0]=',';      
        m=0,max=1;
    }
     printf("%s",s2[k]);
    for(i=1;i

13.长度第K长的子串(5.23)

输入
 第一行 一个子串 1  只包含大写字母
 第二行为k的值

 输出
 输出连续出现次数第k多的字母的次数

 例子:
 输入
         AABAAA
         2
 输出
         1
   同一字母连续出现最多的A 3次
   第二多2次  但A出现连续3次

输入

AAAAHHHBBCDHHHH
3

输出
2
 如果子串中只包含同一字母的子串数小于k则输出-1
 

#include
#include
int main()
{
    char ch[100];
    int k;
    scanf("%s",ch);
    scanf("%d",&k);
    int key[26]={0};
    int len = strlen(ch);
    int i,j,temp=0,n=1;
    int max[26]={0};
    char ch1;
    for(i=0;imax[ch[i]-'A'])
           {
               key[ch[i]-'A']=n;
               max[ch[i]-'A']=n;
               n=1;
           }
           
          
       }
        else
            n++;
        
    }
    for(i=0;i<26;i++)
    {
        for(j=i+1;j<26;j++)
        {
            if(key[i]

14.出租车计费

程序员小明打了一辆出租车去上班。出于职业敏感,他注意到这辆出租车的计费表有点问题,总是偏大。
出租车司机解释说他不喜欢数字4,所以改装了计费表,任何数字位置遇到数字4就直接跳过,其余功能都正常。

比如:
23再多一块钱就变为25;
39再多一块钱变为50;
399再多一块钱变为500;
小明识破了司机的伎俩,准备利用自己的学识打败司机的阴谋。
给出计费表的表面读数,返回实际产生的费用

示例1:
输入
  5
输出
  4
说明
  5表示计费表的表面读数。
  表示实际产生的费用其实只有4块钱。

示例2:
输入
  17
输出
  15
说明
  17表示计费表的表面读数。
  15表示实际产生的费用其实只有15块钱。
示例3:
输入
  100
输出
  81
说明:100表示计费表的表面读数,81表示实际产生的费用其实只有81块钱
 

#include
int is_four(int a)
{
    int k=1;
    while(a)
    {
        if(a/10==4||a%10==4)
        {
            k=0;
            break;
        }
        a/=10;
    }
    return k;
}
int main()
{
   int i,N,count=0,k;
    scanf("%d",&N);
    for(i=1;i<=N;i++)
    {
        k=is_four(i);
        if(k==1)
        {
            count++;
        }
    }
    printf("%d",count);
}

15.求解连续数列(5.24)

已知连续正整数数列{K}=K1,K2,K3...Ki的各个数相加之和为S,i=N (0

输入描述:

输入包含两个参数,1)连续正整数数列和S,2)数列里数的个数N。

输出描述:

如果有解输出数列K,如果无解输出-1

示例1

输入

525 6

输出

85 86 87 88 89 90

示例2

输入

3 5

输出

-1
 

#include
int main()
{
    int s,n,i,sum=0;
    scanf("%d %d",&s,&n);
    for(i=1;i<=n;i++)
    {
        sum+=i;
    }
    int k=(s-sum)/n;
    if(n*k+sum==s)
    {
        for(i=1;i<=n;i++)
        {
            printf("%d ",k+i);
        }
    }
    else
        printf("-1");
}

16.查找众数及中位数

众数是指一组数据中出现次数量多的那个数,众数可以是多个

中位数是指把一组数据从小到大排列,最中间的那个数,如果这组数据的个数是奇数,那最中间那个就是中位数,如果这组数据的个数为偶数,那就把中间的两个数之和除以2,所得的结果就是中位数

查找整型数组中元素的众数并组成一个新的数组,求新数组的中位数

输入描述:

输入一个一维整型数组,数组大小取值范围 0

输出描述:

输出众数组成的新数组的中位数

示例1:

输入

10 11 21 19 21 17 21 16 21 18 15

输出

21

示例2:

输入

2 1 5 4 3 3 9 2 7 4 6 2 15 4 2 4

输出

3

示例3:

输入

5 1 5 3 5 2 5 5 7 6 7 3 7 11 7 55 7 9 98 9 17 9 15 9 9 1 39

输出

7
 

#include
int main()
{
    int a[1000]={0},i=0,max=0,k=0,j,temp;
    int zh[1000]={0};
    int new[1000]={0};
    char ch;
    while(scanf("%d%*c",&a[i])!=EOF)
    {
        zh[a[i]]++;
        i++;
    }
    for(i=0;i<1000;i++)
    {
        if(zh[i]>max)
            max=zh[i];
    }
    for(i=0;i<1000;i++)
    {
        if(zh[i]==max)
        {
            new[k]=i;
            k++;
        }
    }
    for(i=0;inew[j])
            {
                temp=new[i];
                new[i]=new[j];
                new[j]=temp;
            }
        }
    }
    if(k%2==1)
    {
        printf("%d",new[k/2]);
    }
    else
    {
        double c=(new[k/2]+new[k/2-1])/2.0;
         printf("%lf",c);
    }
       
}

17.寻找相同子串

给你两个字符串 t 和 p ,要求从 t 中找到一个和 p 相同的连续子串,并输出该字串第一个字符的下标。

输入描述:

输入文件包括两行,分别表示字符串 t 和 p ,保证 t 的长度不小于 p ,且 t 的长度不超过1000000,p 的长度不超过10000。

输出描述:

如果能从 t 中找到一个和 p 相等的连续子串,则输出该子串第一个字符在t中的下标(下标从左到右依次为1,2,3,…);如果不能则输出”No”;如果含有多个这样的子串,则输出第一个字符下标最小的。

示例1

输入

AVERDXIVYERDIAN

RDXI

输出

4
 

#include
#include
int main()
{
   char t[100];
    char p[100];
    scanf("%s",t);
    scanf("%s",p);
    int i,j=0,k;
    int m=strlen(t);
    int n=strlen(p);
    for(i=0;i

18.字符串统计(5.25)

给定两个字符集合,一个为全量字符集,一个为已占用字符集。已占用的字符集中的字符不能再使用,要求输出剩余可用字符集。

输入描述:

1、输入为一个字符串,一定包含@符号。@前的为全量字符集,@后的字为已占用字符集。

2、已占用字符集中的字符一定是全量字符集中的字符。字符集中的字符跟字符之间使用英文逗号分隔。

3、每个字符都表示为字符加数字的形式,用英文冒号分隔,比如a:1,表示1个a字符。

4、字符只考虑英文字母,区分大小写,数字只考虑正整形,数量不超过100。

5、如果一个字符都没被占用,@标识仍然存在,例如a:3,b:5,c:2@

输出描述:

输出可用字符集,不同的输出字符集之间回车换行。

注意,输出的字符顺序要跟输入一致。不能输出b:3,a:2,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

 
 

#include
#include
int main()
{
  char s1[1000],s[1000];
    char s2[1000],ch;
    int a[128]={0},a1[128]={0},n,i=0,j=0,k=0,b[52]={0};
    scanf("%s",s);
    int len=strlen(s);
    if(s[len-1]=='@')
    {
        printf("%s",s);
    }
    else
    {
        for(i=0;i='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z'))
            {
                a[s[i]]=s[i+2]-'0';
                b[j]=a[s[i]];
                s1[j]=s[i];
                j++;
            }
        }
        for(i=k+1;i

你可能感兴趣的:(c语言)