CCI_Q1.3

本文参考该作者文章:

作者:Hawstein
出处:http://hawstein.com/posts/ctci-solutions-contents.html

一.

C语言运算符优先级:http://www.cnblogs.com/xiehy/archive/2010/02/04/1663825.html

优先级

运算符

    

要求运算

对象的个数

结合方向

1

()

[]

->

.

圆括号

下标运算符

指向结构体成员运算符

结构体成员运算符

 

自左至右

2

!

逻辑非运算符

1

(单目运算符)

自右至左

~

按位取反运算符

++

自增运算符

--

自减运算符

-

负号运算符

(类型)

类型转换运算符

*

指针运算符

&

地址与运算符

sizeof

长度运算符

3

*

/

%

乘法运算符

除法运算符

求余运算符

2

(双目运算符)

自左至右

4

+

-

加法运算符

减法运算符

2

(双目运算符)

自左至右

5

<< 

>> 

左移运算符

右移运算符

2

(双目运算符)

 

6

<=

>=

关系运算符

2

(双目运算符)

自左至右

7

==

!=

等于运算符

不等于运算符

2

(双目运算符)

自左至右

8

&

按位与运算符

2

(双目运算符)

自左至右

9

^

按位异或运算符

2

(双目运算符)

自左至右

10

|

按位或运算符

2

(双目运算符)

自左至右

11

&&

逻辑与运算符

2

(双目运算符)

自左至右

12

||

逻辑或运算符

2

(双目运算符)

自左至右

13

? :

条件运算符

3

(三目运算)

自右至左

14

=

+=

-=

*=

/=

%=

>>=

<<=

&=

^=

|=

赋值运算符

2

自右至左

15

,

逗号运算符

 

自左至右

         运算符优先级记忆方法:

                                              
 

 二.

Q:设计算法并写出代码,移除字符串中重复的字符,不能使用额外的缓存空间。注意: 可以使用额外的一个或两个变量,但不允许额外再开一个数组拷贝。

CODE:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<memory.h>
 4 //不用额外数组。
 5 //每访问一个i,就遍历一遍i+1至len之间的元素,将与s[i]元素相同的标记为NUL。
 6 //将不重复的元素放到原数组中,末尾补NUL。
 7 void removeDuplicate(char s[])
 8 {
 9     int len=strlen(s);
10     if(len<2) return;
11     int i=0,j=0,p=0;
12     for(;i<len;i++)
13     {
14         if(s[i]!='')//s[i]元素没出现过,为真?
15         {
16             s[p++]=s[i];
17             for(j=i+1;j<len;j++)
18                 if(s[i]==s[j])
19                 {
20                     s[j]='';//删除重复的元素。
21                 }
22         }
23     }
24     s[p]='';
25 }
26 //需要额外的数组。
27 //对于0-127的ASCII可以用int[4]数组(4个*4字节*8位=128位)记录,
28 //该字符出现,则对应的该位为1。
29 //可参见CCI_Q1.1
30 void removeDuplicate2(char s[])
31 {
32     int len=strlen(s);
33     if(len<2) return;
34     int b[4],i=0,p=0;
35     memset(b,0,sizeof b);
36     for(;i<len;i++)
37     {
38         int v=(int)s[i];
39         int index=v/32,l=v%32;//index为该字符在index(0-3)下标,L(0-31)为该字符在index下标下的L位。
40         if((b[index]&(1<<l))==0)//位运算符(&)优先级小于关系运算符(==)
41         {
42             s[p++]=s[i];
43             b[index]|=(1<<l);//将对应的位设为1。
44         }
45     }
46     s[p]='';
47 }
48 void showS(char s[])
49 {
50     printf("%s
",s);
51 }
52 int main()
53 {
54     char s1[]="aaaaa";
55     char s2[]="abababababc";
56     removeDuplicate2(s1);
57     showS(s1);
58     removeDuplicate2(s2);
59     showS(s2);
60     return 0;
61 }
原文地址:https://www.cnblogs.com/jhooon/p/3532577.html