2018华为实习
- 第一题
给你一个原始字符串,根据该字符串内每个字符出现的次数,按照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!='
') {
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格,每个数的值表示你从这个位置可以跳跃的最大长度。计算如何以最少的跳跃次数跳到最后一个数。
输入描述:
第一行表示有多少个数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
", 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
", step);
return 0;
}
- 第三题
任意位数整数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] = {' '}, num2[100] = {' '};
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("
");
}
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;
}