2018华为暑期实习

2018华为实习

  1. 第一题

给你一个原始字符串,根据该字符串内每个字符出现的次数,按照ASCII码递增顺序重新调整输出。

举例!假设原始字符串为:
eeefgghhh
则每种字符出现的次数分别是:
(1).eee 3次
(2).f 1次
(3).gg 2次
(4).hhh 3次
重排输出后的字符串如下:
efghegheh
编写程序,实现上述功能。
【温馨提示】
(1).原始字符串中仅可能出现“数字”和“字母”;
(2).请注意区分字母大小写。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAXLINE 1024
int main()
{
    char str[MAXLINE+1] = {0};
    int ind[62] = {0};
    int i = 0, j = 0, len = 0;
    while((i = getchar()) != EOF && i!='\n') {
        str[len++] = i;
        if(i>='0' && i<='9') {
            ind[i-'0']++;
        }
        if(i>='A' && i<='Z') {
            ind[i-'A'+10]++;
        }
        if(i>='a' && i<='z') {
            ind[i-'a'+36]++;
        }
    }

    for(i = 0; i<len; i++){
        for(j = 0; j<62; j++) {
            if(ind[j]>0) {
                printf("%c", j>=36?j-36+'a':(j>=10? j-10+'A':j+'0'));
                ind[j]--;
            }
        }
    }

    return 0;
}
  1. 第二题

给出一组正整数,你从第一个数向最后一个数方向跳跃,每次至少跳跃1格,每个数的值表示你从这个位置可以跳跃的最大长度。计算如何以最少的跳跃次数跳到最后一个数。

输入描述:
第一行表示有多少个数n
第二行开始依次是1到n个数,一个数一行
输出描述:
输出一行,表示最少跳跃的次数。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAXLINE 1024

int ministep(int num[], int left, int right)
{
    if(left == right-1) {
        return 1;
    }
    int i = 0; 
    int step = right-left;
    int index = right;
    int tmp = 0;
    for(i = right-1; i>=left; i--) {
        if(num[i] >= right-i) {
            tmp = ministep(num, left, i);
            if(tmp+1 < step) {
                step = tmp+1;
                index = i;
            }
        }
    }

    return step;

}
int main()
{
    int n = 0;
    int i = 0;
    int step = 0;
    int *num = NULL;
    //int tmp = 0;

    scanf("%d", &n);
    if(n==0) {
        step = 0;
        printf("%d\n", step);

        return 0;
    }

    num = (int*)malloc(n*sizeof(int));

    for(i = 0; i<n; i++) {
        scanf("%d", num+i);
    }
    step = ministep(num, 0, n-1);

    printf("%d\n", step);

    return 0;
}
  1. 第三题

任意位数整数A和B相乘

#include<stdio.h>
#include<string.h>
#include<malloc.h>


#define Int(X) (X - '0') /**************/

int *multi_big_integer(const char *, const char *);
int check_num(const char *);

int main(void)
{
    char num1[100] = {'\0'}, num2[100] = {'\0'};
    while(scanf("%s%s", num1, num2) != EOF)
    {
        int *result = NULL;
        int i, change = 0;

        if(strlen(num1) > 100 || strlen(num2) > 100)
        {
            return 1;
        }

        if(check_num(num1) || check_num(num2))
        {
            return 1;
        }


        result = multi_big_integer(num1, num2);


        for(i = 1; i <= result[0]; i++)
        {
            if(result[i] != 0) 
                change = 1;
            if(!change)
            {
                if(i > 1)        
                    {             
                        printf("0");
                        break;
                    }
                continue;
            }
            printf("%d", result[i]);
        }
        printf("\n");
    }
    return 0;
} 


int check_num(const char *num)
{
    int i;
    for(i = 0; (size_t)i < strlen(num); i++)
    {
        if(num[i] < '0' || num[i] > '9')
        {
            return 1;
        }
    }
    return 0;
}

int *multi_big_integer(const char *num1, const char *num2)
{
    int *result = NULL;               
    int num1Len = strlen(num1);      
    int num2Len = strlen(num2);      
    int resultLen;                    
    int i, j;                         
    resultLen = num1Len + num2Len;     

    result = (int *)malloc((resultLen+1)*sizeof(int));
    memset(result, 0, (resultLen+1)*sizeof(int));

    result[0] = resultLen; 

    for(j = 0; j < num2Len; j++)
    {
        for(i = 0; i < num1Len; i++)
        {

            result[i+j+2] += Int(num1[i]) * Int(num2[j]);
        }
    }

    for(i = resultLen; i > 1; i--)
    {
        result[i-1] += result[i]/10;
        result[i] = result[i]%10;
    }

    return result;
}

猜你喜欢

转载自blog.csdn.net/cclethe/article/details/79887698