手打一遍“阿里巴巴2013校招代码之谜”...

来源:互联网 发布:手机上如何改淘宝评价 编辑:程序博客网 时间:2024/06/06 15:38
#include <stdio.h>#include <memory.h>// 以下为要输出的字符串常量,已删除障碍性注释const char *w[] = {"百","校","聚","会","ALIBABA","全","集","合","集","ABC",// w[0] - w[9]"拿","手","聘","用","尺","度",",","莫","ALI","云",// w[10] - w[19]"里","雾","里","ali","雾","巴","此","天","方","夜",// w[20] - w[29]"谭","ocCCCCC","合","团","聚","园","云","计","算","@@@@:OOCCCCC",// 到w[39]"CC","BB","AA","1","AA","@@@c88CCCCCC","莫","非","常","CC",// w[40] - w[49]"CC","C","宝贝","阿","云","招","手","CCC","ALIBABA","地",// w[50] - w[59]"此","巴","全","用"," ","巴","刻","度","于","!",// w[60] - w[69]"?","聚","20","AA","3","百","常","我",". ","Z",// w[70] - w[79]"ALI","属","于","天","时","地","利","人","和" };// w[80] - w[88]const int wc = sizeof(w) / sizeof(w[0]);// wc值为w数组长度,89int idx[wc];// 大小为89的整型数组idxint idxc = 0;int wn[wc];// 大小为89的整型数组wnstruct Node{// id默认赋值-1Node(): id(-1){// 由于我使用VC不支援bzero函数,用memset替代bzero函数,// 完成对ch的置0操作。memset(ch, 0, sizeof(ch));}// ch数组,内有256个Node型指针变量Node *ch[256];int id;};Node *r = new Node();// 被调用89次。id依次取值从0到88。(*s)依次取值w[0]到w[88]。void add(int id, const unsigned char *s){// 给p指针赋值全局的Node对象(*r)Node *p = r;while (*s)// 直到(*s)值为0x00,当传入中文单个字符时,{// 循环体执行2次Node *&q = p->ch[*s];// q指向/引用p的成员ch的第(*s)个指针// *s为unsigned char,所以取值[0, 255]if (!q) q = new Node();// q所指为NULL时创建新Node对象// 最终共创建128个对象p = q;// p的成员ch所含对应指针赋给p++s;}if (p->id == -1)// p所指对象首次创建时,修改p->id逐次增1idx[p->id = idxc++] = wn[id] = id;// 最终idxc取值62else{// p所指对象已被修改p->idwn[id] = wn[idx[p->id]];idx[p->id] = wn[idx[p->id]] = id;// idx[p->id]始终为id}}int main(){for (int i = 0; i < wc; ++i){add(i, (const unsigned char *)w[i]);}int id = 53;for (;;){printf("%s", w[id]);// 在此输出字符串,第一个为w[53] "阿"if (++id == wc)// 迷惑性语句,为++idid = 0;if (wn[id] == id)break;if ((id = wn[id] + 1) == wc)// 迷惑性语句,为id=wn[id]+1id = 0;}return 0;}

原创粉丝点击