zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    csr_matrix参数解析
    SQL删除重复数据(根据多个字段),pandas的nan存入数据库报错
    XGBoost参数中文翻译以及参数调优
    pandas.DataFrame.quantile
    pandas.DataFrame.rank
    JOIN子句
    ORDER BY子句
    WHERE子句
    SELECT语句
    数据分析-基础
  • 原文地址:https://www.cnblogs.com/jhooon/p/3532577.html
Copyright © 2011-2022 走看看