2018華爲暑期實習

2018華爲實習

  1. 第一題

給你一個原始字符串,根據該字符串內每一個字符出現的次數,按照ASCII碼遞增順序從新調整輸出。ui

舉例!假設原始字符串爲:
eeefgghhh
則每種字符出現的次數分別是:
(1).eee 3次
(2).f 1次
(3).gg 2次
(4).hhh 3次
重排輸出後的字符串以下:
efghegheh
編寫程序,實現上述功能。
【舒適提示】
(1).原始字符串中僅可能出現「數字」和「字母」;
(2).請注意區分字母大小寫。spa

#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格,每一個數的值表示你從這個位置能夠跳躍的最大長度。計算如何以最少的跳躍次數跳到最後一個數。code

輸入描述:
第一行表示有多少個數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相乘get

#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;
}
相關文章
相關標籤/搜索