2.11 [华为招聘机试题目整理]2018

题目来源https://blog.csdn.net/wgx571859177/article/details/79678656

1.数字处理

 

题目描述:给出一个不多于5位的整数,进行反序处理,要求

(1)求出它是几位数

(2)分别输出每一个数字(空格隔开)

(3)按逆序输出各位数字(仅数字间以空格间隔,负号与数字之间不需要间隔)

输入描述:位数不大于5的整数

输出描述:1.整数位数 2.空格间隔输出结果 3.逆序整数

#include<stdio.h>
#include<string.h>
char k[7];
int weishu,i,l,f,ff;
void main()
{
    while(scanf("%s",&k)!=EOF)
    {
        l=strlen(k);
        f=0;                         //标记正负号,正数为0,负数为1
        if(k[0]=='-')
        {
            f=1;
            for(i=1;i<l;i++)
                k[i-1]=k[i];
            k[l-1]='\0';
            l--;
        }
        weishu=l;
        for(i=0;i<l;i++)
        {

            if(k[i]=='0')
                weishu--;
            else
                break;
        }
        printf("总位数:%d\n",weishu);
        //分别输出每一个数字
        printf("每一个数字:");
        for(i=0;i<l;i++)
            printf(" %c",k[i]);
        printf("\n");
        //按逆序输出每一个数字
        printf("逆序输出每一个数字:");
        if(f)
        {
            printf("-");
        }
        for(i=l-1;i>0;i--)
            printf("%c ",k[i]);
        printf("%c\n",k[0]);
    }
}

用时40min???我也太慢了吧。。。。

主要读题目的有时候有点点曲解他的意思,还有想太多,所以以后在读题目的时候一定要谨慎。

 

 

2.输入四个IP端,前两个为第一个IP段的起始和终止地址,后两个是第二个IP段的起始和终止地址,判断这两个IP段是否存在交集

输入描述:输入4个IP

输出描述:如果存在交集,输出 Overlap IP ; 如果不存在交集,输出 No Overlap IP 

#include<stdio.h>
int add[5][5],i,j;
char d;
void swap(int *a,int *b)
{
    int temp;
    temp=*a;
    *a=*b;
    *b=temp;
}
void main()
{
    for(i=0;i<4;i++)
    {
        for(j=0;j<4;j++)
        {
            scanf("%d",&add[i][j]);
            if(j!=3)
                scanf("%c",&d);
        }
    }
    //保证存在add[0]中的起始地址比存在add[3]中的小
    for(i=0;add[0][i]==add[2][i];i++);
    if(add[0][i]>add[2][i])
    {
        for(j=0;j<4;j++)
        {
            swap(&add[0][j],&add[2][j]);
            swap(&add[1][j],&add[3][j]);
        }
    }
    for(i=0;add[1][i]==add[2][i];i++);
    if(add[1][i]<add[2][i])
        printf("No Overlap IP\n");
    else
        printf("Overlap IP\n");
}

用时45min 

我看到网上大势似乎是把ip地址转化成二进制,然后判断,我寻思我这应该也没错吧。。


题目

给定字符串内有很多正整数,要求对这些正整数进行排序,然后返回排序后指定位置的正整数 
 
排序要求:按照每个正整数的后三位数字组成的整数进行从小到大排序 
1)如果不足三位,则按照实际位数组成的整数进行比较 
2)如果相等,则按照输入字符串中的原始顺序排序 
 
说明(以下内容考生无须检查,调用者保证): 
1) 字符串以’\0’结尾,仅包含数字、空格 
2) 字符串内正整数之间以单个空格分隔,字符串首尾没有空格 
3) 正整数格式为十进制,大小:1~1000000,正整数的数字非零开始 
 
 
示例:
如字符串内容
1223 22 3232 2016
 
按照规定排序后 
2016 22 1223 3232
 
查询排序后的第3个数是 
1223

#include<stdio.h>
#include<string.h>
int ten(int n)
{
    int res=1;
    for(int i=0;i<n;i++)
        res*=10;
    return res;
}
void swap(int *a,int *b)
{
    int temp;
    temp=*a;
    *a=*b;
    *b=temp;
}
void main()
{
    char str[1000000];
    char s[8];
    int l,i,j,k,cnt,n,num[100000][2];
    while(gets(str))
    {
        scanf("%d",&n);
        memset(num,0,sizeof(num));
        l=strlen(str);
        j=0;
        cnt=0;
        for(i=0;i<l;i++)
        {
            if(str[i]==' ')
            {
                for(k=0;k<j;k++)
                    num[cnt][0]+=(s[k]-'0')*ten(j-k-1);
                j=0;
                cnt++;
                continue;
            }
            s[j++]=str[i];
        }
        for(k=0;k<j;k++)
                    num[cnt][0]+=(s[k]-'0')*ten(j-k-1);
        //求出后三位数
        for(i=0;i<=cnt;i++)
            num[i][1]=num[i][0]%1000;
        //按照后三位数升序进行排序
        for(i=0;i<=cnt;i++)
        {
            for(j=0;j<cnt-i;j++)
            {
                if(num[j][1]>num[j+1][1])
                {
                    swap(&num[j][0],&num[j+1][0]);
                    swap(&num[j][1],&num[j+1][1]);
                }
            }
        }
        printf("按照规定排序后:");
        for(i=0;i<cnt;i++)
            printf("%d ",num[i][0]);
        printf("%d\n",num[cnt][0]);
        printf("查询后第%d个数为:",n);
        printf("%d\n",num[n-1][0]);
    }
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值