杂题:一些程序基础的小题目

这些是以前面试过或者是看过的程序题目,现在先记下来,以后翻翻。

1、十进制数n转二进制

(1)、每次和1按位与(n&1),n >> 1
(2)、c++中用bitset:bitset<sizeof(int) * n > bs(n);

2、n的二进制有几个1
count = 0;
while( n = n&(n-1) )  /* 每次少一个1 */
    count++;

关于指针的题目。

(1)、char s[] = "abcdefghijk";
char e = *(char*) ( (int*)(&s[3]) + 1);
问e的值

(2)、char s[] = "abcd";
short int h = *(short int *)s;
问h的值(注意是little endian的cpu)

3、void trimSpace(char *s) 功能是:去掉字符串s中多余的空格,要实现这个函数

(下面是参考stl中unique的实现而来,原理嘛,上机试试就知道了)

void trimSpace(char *s)
{
    char *curr = s;
    char *first = s;
    while( *(++first) )
    {
        if( *first != ' ' || *curr  != ' ')
           *(++curr) = first;
    }
    ++curr;
    s[curr - s] = '/0';
}

4、用一个字节的额外空间,循环右移字符串。(时间上限为O(n))

voie rotate(char *s, int len, int m)  /* 将长为len的串循环右移m位 (m  小于 n)*/

方法:比如原串为 a = "a1a2a3...anb1b2b3...bm"(1,2,3...m,n是下标哈) m+n = len
现为了变为b = "b1b2b3..bma1a2a3...an"

如下:

(1)、将a1a2a3..an倒过来变成 c = "an...a3a2a1b1b2b3...bm"
(2)、将c串中的b1b2b3...bm也倒过来,变成d="an...a3a2a1bm...b3b2b1"
(3)、将d串整体倒置即得所求:e = "b1b2b3...bma1a2a3...an"

你可能感兴趣的:(杂题:一些程序基础的小题目)