力扣上一道关于涉及ASCII码的题目,题目为:
给你一个字符串 s,它由数字(‘0’ - ‘9’)和 ‘#’ 组成。我们希望按下述规则将 s 映射为一些小写英文字符:
字符(‘a’ - ‘i’)分别用(‘1’ - ‘9’)表示。
字符(‘j’ - ‘z’)分别用(‘10#’ - ‘26#’)表示。
返回映射之后形成的新字符串。
题目数据保证映射始终唯一。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/decrypt-string-from-alphabet-to-integer-mapping
要求将数字转换成字母,因此联想到使用ascii码进行转换,首先我们要了解ascii码怎么用:
比如我们的ASCII码 a 对应的是数值是 97 ,那么在内存里面,就是存放的是 97 的二进制。当你把 97 当作数据时,那么它就是 97;如果你把它当作字符,那么计算机就会调用计算机图形学的编程,将 a 的图形绘制到屏幕上,举个代码例子:
#include<stdio.h>
int main(){
int a ='a';
int b = a + 2;
int c = 52;
// %c表示输出互相转换对应的ASCII值
printf("%d %c %c",a,b,c);
}
控制台输出:
题目中给出的a到i用1到9表示,j到z用’10#’ - '26#'表示,既然如此,那么我就用这些混淆视听的数字凑出ascii码的数值,以此得到相应的字母。
附上所用到字母的ascii码:
通过实例一可知,可以从判断数组s的第三个元素入手,若为‘#’,则将其之前的两位数作为一个数字进行计算,并且指针每次往后移动两位数字,继续进行判断;否则,每次移动一位数字,并且将这一位数作为一个数字进行计算ascii码值。
另外记录一下,if(a&&b)与if(b&&a)的不同,执行顺序从左向右,因此第一次运行时误将if(i+2<len && s[i+2]’#’)搞反了,先判断了s[i+2]’#'导致i值超出范围的报错。
附上代码:
char * freqAlphabets(char * s){
int len = strlen(s);
char *dict = (char*)malloc(sizeof(char)*(len));//定义动态分配数组
int i=0;
int dictsize=0;
int num;
memset(dict,0,len);
for(i=0;i<len;i++){
if(i+2<len && s[i+2]=='#'){
num=(s[i]-'0')*10+s[i+1]-'0';
i+=2;
}else{
num=s[i]-'0';
}
dict[dictsize++]=num+'a'-1;
}
return dict;
}