|
昨晚在微信群看到一个读者发的面试题目,从网上截图出来的,我百思不得其解,题目如图。
幸好,我学过栈. C% a& T, i* ~/ i1 J1 ~0 V 然后我写了个小程序 ) L* }3 h9 h; q! ` 第一个方法比较笨,当我写完自己的代码后,看到有同学发了自己的代码,我赶紧就发了个红包,一个是为了鼓励大家多讨论问题,一个是为了赞扬这样的行为。 第一个方法就是取出每一个bit,压栈,然后再出栈,你想怎么排序都没有问题。 #include "stdlib.h") ]$ @' \$ [9 q# P) u0 E struct List{ int data;: n$ p- O6 g4 Q' n! a) @ struct List * next;" G, I9 K; I& A4 G8 ]" Z }; struct Stack{ struct List *head; int size; }; struct Stack * StackInit(void)5 B3 ?& F! H( j {" M% K+ I' D0 h- E9 i struct Stack *stack = NULL; stack = (struct Stack*)malloc(sizeof(struct Stack));$ Y8 R" ?8 V0 L! U stack->head = (struct List *)malloc(sizeof(struct List));. O3 w( P, {1 a `/ A5 i U stack->head->next = NULL; stack->size = 0; return stack; }+ r0 | X# S% C N9 q6 P2 l; f / L$ E* B+ _/ U' o+ P* h8 ?4 Z int StackPush(struct Stack *stack,int data) { struct List *tmp = (struct List *)malloc(sizeof(struct List));8 ]- Z# @4 O5 o) r" ]/ Y tmp->data = data;6 n" M2 X4 f, n% P tmp->next = stack->head->next;2 y7 g: ^# [( U d% C* ~5 y [ stack->head->next = tmp;" Q: Y6 N' R$ i% Y" R* A stack->size++;& w- g' L8 p# c( Y0 l6 _" m) _$ i //printf("push:%d \n",data);5 y/ o. I/ i+ w1 M$ j return 0;) \& V9 y% N" i } int IsStackEmpty(struct Stack *stack)4 e( m. ]: `' f/ U3 p8 ^: I% W {: J+ a7 I# n) v( ?- C L8 Z( K if(stack->head->next == NULL){/ f. H% _9 B- L- n$ g //printf("stack null\n");5 Z- Q! `- y6 f& D0 L return 1; }else{ //printf("stack is not null\n"); return 0; } } int StackPop(struct Stack *stack,int *data) {3 m& |8 B; f. q t5 u struct List *tmp = NULL;/ x/ d' k5 i4 P/ t if(IsStackEmpty(stack)) return -1; tmp = stack->head->next; *data = tmp->data; stack->head->next = tmp->next;1 O" J* n; w: z9 C; ^6 o' B stack->size--;/ U2 v' H- I; q, d) X6 Y. M if(tmp!=NULL) free(tmp);6 Z; S: l$ _5 u //printf("pop:%d \n",*data);6 B, j* ~0 ]9 f7 ?. H return 0; }4 p- b( |3 [3 U+ D/ L, U & l9 F- r: B) _' v 4 H8 J9 { Y( q: p int main(void)4 y' s) I1 w5 O, x# l% u {0 m1 k [6 x8 {$ A0 K# z! r int i = 0;: E5 `- q, |* u( f unsigned char a = 0x71; unsigned char b = 0;+ J2 Y7 X. r0 b+ a struct Stack *stack = NULL;+ p- ]! q" c: r3 V5 ^6 I, F stack = StackInit();5 m3 n, d7 ^6 U9 ~ 8 `$ y, {; s, i/ ]) j5 A" x0 x/ U printf("a:0x%x\n",a);! q5 O1 I+ k* h M$ i+ E$ w for(i = 0;i<8;i++) {! p2 f( `9 z# x+ g7 T if(a&0x10) StackPush(stack,1); else StackPush(stack,0); if(a&0x20) StackPush(stack,1); else StackPush(stack,0);% X3 s- ?) f* x& {) U7 p/ v if(a&0x40) StackPush(stack,1); else StackPush(stack,0); if(a&0x80) StackPush(stack,1); else StackPush(stack,0);" R$ q& R& N/ x6 Q% K 8 F( e2 B( x2 |8 E0 z, x4 h if(a&0x01) StackPush(stack,1); else StackPush(stack,0); % K v) d$ O2 H/ ]) y if(a&0x02) StackPush(stack,1); else StackPush(stack,0); if(a&0x04) StackPush(stack,1); else StackPush(stack,0); if(a&0x08) StackPush(stack,1);" [0 Z9 a5 n W else StackPush(stack,0); 2 [: l3 s3 {) E) K8 R6 ^$ f } for(i = 0;i<8;i++) {' N: S [/ n" g9 W' D int d = 0;0 F/ G# O" H7 a0 K StackPop(stack,&d); if(i == 0)2 r$ Z" G8 C t, ~$ T/ \ if(d == 1) b |= 0x80;3 X6 H2 {/ K" N7 Y& W1 t& L7 k if(i == 1) if(d == 1) b |= 0x40; 0 _3 S3 r7 @9 n/ l/ k7 J. B if(i == 2)0 x9 W& N7 v9 Y: ? if(d == 1) b |= 0x20;# B, |3 ~5 F/ T, f" l3 e& K4 | if(i == 3)3 }: ~7 [) e- T, @( b if(d == 1) b |= 0x10; ) j' ` R7 R4 o1 ]# }& X if(i == 4)1 |) X& \$ @! h7 `" [* V% g$ p1 |8 }2 q if(d == 1) b |= 0x08;/ R q" b1 v; [( Z 3 E' ?, \$ W; F8 M if(i == 5) if(d == 1) b |= 0x04;/ B0 k8 F! F" x; l$ S if(i == 6) if(d == 1) b |= 0x02; if(i == 7)+ ^0 v% A7 R/ q4 j) d v5 f+ U: f if(d == 1) b |= 0x01;# E$ d7 {6 F3 I7 | 2 A V2 z" V" a% ^$ G5 `- ] } & L2 E# k2 O8 n printf("\nb:0x%x\n",b); return 0;1 I. q/ x" M' t, Y } 5 N; @! I! _/ \6 L! Z2 w; ^8 o. u 执行如下: 3 N0 r, N9 v7 {
0 Y0 o4 }6 b* m' X* V 除了用栈来实现,群里有位同学的答案让我眼前一亮 . v6 W1 x- t( H, J( N struct charbits{8 @& H5 u' C d C' | unsigned char data1 : 4; unsigned char data2 : 4;/ N2 q0 Y( S9 L2 m1 `- ? }; union dataChange{( f: k8 S; U% c Y+ I struct charbits charBits; unsigned char data; }datchange,*p; int main(){7 D2 R9 b5 {& Z+ y+ E unsigned char temp;9 {* z0 o, R- u' P 4 E8 v. |! Z1 Z p = &datchange;" Y |8 F) E* E s datchange.data = 0x34; temp = p->charBits.data1;1 n8 l" q7 D1 L6 t: b) W/ ? p->charBits.data1 = p->charBits.data2; p->charBits.data2 = temp;7 d4 @ g% ]3 u9 P; E* v " ~6 H4 c7 e/ t5 _: S. G printf("data is %x", datchange.data);) U6 j& C8 \0 k( ` ( V3 j* O- B; Q, Y+ {2 n return 0;) _. V7 M; O2 i* b# S }
' p i" ]" V: _ 完美演示了位域、共用体、结构体、指针的几个知识点~ 测试下位域的作用 + l, Q5 M: M; H* `. Z struct charbits{* L6 W6 j* g' p8 _8 _ unsigned char data1 : 1; unsigned char data2 : 3;& Z+ ?3 p) X2 M B };" a3 T4 T v/ _+ S" s+ | + N2 n5 @' X0 g1 ^* D5 R6 D struct charbits1{. W' H% d4 T% W! T9 _, B7 }5 O+ W$ c unsigned char data1; unsigned char data2; }; ; M7 e2 E! q6 d int main(){/ [$ u W- Y. g4 R: i! u& A* L ' e4 q4 }' P4 T. d7 { struct charbits a; struct charbits1 b;- p o6 F' M: P8 }) J" \$ O printf("%d %d\n",sizeof(a),sizeof(b)); 2 c# K& T. L0 w# \0 }3 L /*赋值1看看*/ a.data1 = 1; printf("%d\n",a.data1);# ?7 B6 T9 B; \* q- b /*赋值3看看*/ a.data1 = 3; printf("%d\n",a.data1); K5 J4 }3 t8 }1 T /*赋值3看看*/" X7 |( l7 M7 o6 F( h a.data2 = 3;* }1 Z) v& k6 c7 \ I, f printf("%d\n",a.data2);. H' S# i3 |5 q* ~2 r2 S ) S2 j8 g1 u; X /*赋值7看看*/( x/ x6 _- o- E a.data2 = 7; printf("%d\n",a.data2);2 {6 U, b" m& J9 `9 V& K " \ r8 A7 P- y9 f( U /*赋值8看看*/4 X1 z+ G" |) }/ _ a.data2 = 8;- F; U; y$ w) [) Y! \* J; Z printf("%d\n",a.data2);; o9 V0 i% E' P. z return 0; }3 i9 j7 W/ N* J! D7 c3 L3 v' C 0 o& h# P4 ]* G- U# V/ a* E data1只能存 0和1,如果存其他值的话就会溢出变成0。 data2是 3bits ,只能存 0~7,我们存 8 进去,就溢出变成 0。
5 ^- ^1 B6 t5 i+ G+ F; `0 i |
微信公众号
手机版
' X* X" j! \& }& [/ F, ?: B* c
const uchar table[256] = {... ...};
result = *(table+convchar);