华为机试(压缩算法)

为了提升数据传输的效率,会对传输的报文进行压缩处理。输入一个压缩后的报文,请返回它解压后的原始报文。压缩规则:

n[str],表示方括号内部的str正好重复n次。注意n为正整数(0 < n <= 100),str只包含小写字母,不考虑异常情况。

输入描述:

输入压缩后的报文:

不考虑无效的输入,报文没有额外的空格,方括号总是符合格式要求的。

原始报文不包含数字,所有的数字只表示重复的次数n,例如不会出现像5b或者3[8]这种输入。

输出描述:

解压后的原始报文

示例1:

输入

3[k]2[mn]

输出

kkkmnmn

示例2:

输入

3[m2[c]]

输出

mccmccmcc

//压缩算法

#include <stdio.h>

#include<math.h>

#include<malloc.h>

#include<stdlib.h>

#include <string.h>

typedef struct stack

{

int Max = 100;

char*A = (char*)malloc(sizeof(char)* Max);

int top = -1;

};

void push(stack *stack, char c)

{

if (stack->top == stack->Max - 1)

return;

strcpy(&(stack->A[++stack->top]), &c);

}

char pop(stack *stack)

{

if (stack->top >= 0)

{

char topvalue=stack->A[stack->top];

stack->A[stack->top] = '\0';

stack->top--;

return topvalue;

}

return NULL;

}

char top(stack* stack)

{

if (stack->top >= 0)

return stack->A[stack->top];

return NULL;

}

int charToInt(char c)

{

if (c == '0')

return 0;

if (c == '1')

return 1;

if (c == '2')

return 2;

if (c == '3')

return 3;

if (c == '4')

return 4;

if (c == '5')

return 5;

if (c == '6')

return 6;

if (c == '7')

return 7;

if (c == '8')

return 8;

if (c == '9')

return 9;

return -1;

}

char*calculate(stack *stackInt, stack *stackChar)

{

//将stackInt里的char->int 用sun保存

int circle = stackInt->top + 1;

double sun = 0;

for (int i = 0; i < circle; i++)

{

sun += charToInt(pop(stackInt))* pow(10.0, i);

}

int countChar = stackChar->top + 1;

char* strChar = (char*)malloc(sizeof(char)*(countChar + 1));

memset(strChar, '\0', countChar + 1);

int i = 0;

while (NULL != top(stackChar))

{

strChar[i] = pop(stackChar);

i++;

}

char* str = (char*)malloc(sizeof(char)*(countChar*sun + 1));

memset(str, '\0', countChar*sun + 1);

for (int i = 0; i < sun; i++)

{

strcat(str, strChar);

}

return str;

}

int main()

{

char S[] = { '3', '[', 'M', '2', '[', 'C', ']', ']' };

stack stackChar;

stack stackInt;

stack stackStr;

memset(stackChar.A, '\0', stackChar.Max);

memset(stackInt.A, '\0', stackInt.Max);

memset(stackStr.A, '\0', stackStr.Max);

for (int i = 0; i < sizeof(S)/sizeof(S[0]); i++)

{

if (S[i] != ']')

{

push(&stackStr, S[i]);

}

else

{

while (top(&stackStr) != NULL&&top(&stackStr) != '[')

{

push(&stackChar, pop(&stackStr));

}

//skip [

pop(&stackStr);

while ('0'<=top(&stackStr) && top(&stackStr)<='9')

{

push(&stackInt, pop(&stackStr));

}

char* temp=calculate(&stackInt, &stackChar);

for (int i = 0; i < strlen(temp); i++)

{

push(&stackStr, temp[i]);

}

}

}

return 0;

}

全部评论
现在华为还在机试吗,这是哪天啊
点赞 回复 分享
发布于 2023-06-25 10:01 江苏

相关推荐

01-17 18:15
已编辑
门头沟学院 前端工程师
从上午约我面试然后他迟到,然后中午发消息打电话给我说重约面试时间,我就该意识到。【管理不规范,只是这家公司最小的问题】他妈一个不是技术的人来给我技术面。。。连vvue什么?连react是什么?连普通的HTTP请求是什么?这些东西都不懂的人来给我做技术面,我真的。。。。他妈浪费我40分钟。。一天面了三场,这家公司属实牛逼。不停的问我说上班下班时间谁来派任务公司在哪个区发展怎么样,公司的管理模式什么样,培养机制怎么样带教负责什么。如果出bug了谁来负责。我真的求你了别闹了。我答了15分钟,我已经很不想回答了。然后他就问了我一些很招笑的面试问题。问我前端框架架构设计怎么设计,Websocket可以实现SSE吗??最后还要我硬说,为什么我们公司没转正?为什么?为什么?我说我怎么知道。。这是领导决定,又不是我决定,他说让我分析一下。。。我真的草了,这个人是来搞我的吗?我最后问我说这个没有技术面,他说他就是技术面虽然我今天面的另外两家也很逆天。一个人不停的吹牛,自己100人的公司是全国前几,吹牛了一个小时。我中途几次想跑,真的是底下玩手机在听他那吹牛。。然后最后来了句说,我承诺的东西要实现哦,不然的话,公司会追责的,我我请问我承诺了什么?从头到尾也没有说让我承诺什么。而且我只是作为一个小小的前端卡拉咪,应届生。我要承担什么??好崩溃。。好崩溃的,一天面了三场。两家1000-9999的公司。面试官问的都很傻逼,甚至有些东西我问他估计都答不出来。。&nbsp;我这是在干嘛呀?浪费我一天的时间,我的奶奶。。我本来是抱着说我很菜,我要面试中发现自己的问题,现在来看他妈的这三场面试,面试本身就是问题。。
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务