本文参考该作者文章:
作者: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 | , | 逗号运算符 |
| 自左至右 |
运算符优先级记忆方法:
![](https://images.cnblogs.com/cnblogs_com/xiehy/C%E8%AF%AD%E8%A8%80%E6%93%8D%E4%BD%9C%E7%AC%A6%E4%BC%98%E5%85%88%E7%BA%A7%E6%8F%8F%E8%BF%B0.jpg)
二.
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]!='\0')//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]='\0';//删除重复的元素。 21 } 22 } 23 } 24 s[p]='\0'; 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]='\0'; 47 } 48 void showS(char s[]) 49 { 50 printf("%s\n",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 }