一道词典算法题,讲单词隐射为词典中的顺序

来源:互联网 发布:js控制按钮 编辑:程序博客网 时间:2024/06/10 18:54

词典中单词的顺序是 a,b,c...z, aa,ab,ac...az, ba,bb,bc...,如果从第一个单词开始数,那么zzzz就是第475254个,如何将一个单词对应到这个序上?反过来给出一个整数,怎么做反向映射?


解法思路,实际单词上就是一种26进制的的表示。 只不过最终在计算值的时候每个位的最小是1 而非 0.

可以把A 隐射成0,  Z 隐射成 25  但是注意计算数值的时候每个位必须加上1.

一下给出了解法,其中将数字转换为单词的时候使用了通常解法和递归解法

原代码如下

#include <stdio.h>#include <string.h>void reverse(char s[]);int strtoNum(char s[]){int value = 0, pow = 1;int len;if ((len = strlen(s)) < 1)return 0;for (int i = len - 1; i >= 0; i--){value += (s[i] - 'a' + 1) * pow;pow *= 26;}return value;}// normal algorithm using the reverse.void numtoStr(int n, char s[]){int i = 0, val = 0;if (n < 1)return;do {s[i++] = (n - 1) % 26 + 'a';n -= 1;} while ( (n /= 26) != 0);s[i] = '\0';reverse(s);}// use recursive.void numtoStr_r(int n, char s[]){static int i;int val;if (n < 1)return;if ((n - 1) / 26)numtoStr_r((n - 1) / 26, s);elsei = 0;s[i++] = (n - 1) % 26 + 'a';s[i] = '\0';}void reverse(char s[]){int i = 0, j = strlen(s) - 1;char t;for (; i < j; i++, j--){t = s[i];s[i] = s[j];s[j] = t;}}int main(int argc, char* argv[]){char num[255];//printf("%ld\n", strtoNum("abcdz"));numtoStr_r(strtoNum("abcdz"), num);printf("%s\n", num);return 0;}



0 0
原创粉丝点击