Chinaunix首页 | 论坛 | 博客
  • 博客访问: 154117
  • 博文数量: 32
  • 博客积分: 2053
  • 博客等级: 大尉
  • 技术积分: 382
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-09 12:45
文章分类

全部博文(32)

文章存档

2011年(12)

2010年(20)

分类: LINUX

2011-02-09 10:46:29

    在一次面试中需要两个有序数组的排序,而且要去掉两个数组中重复的部分,当时实现时只联想起了常规的有序数组合并的方法,没有进行更仔细的思考,其实自己也知道有下面这个使用位数组的方法,但因为题目中的有序两个字使自己联想起了普通的方法,而没有考虑到位数组的方法,导致失败
   有时过多的方便的条件也不是好事,如果没有这个条件可以使我们更清楚的理解问题,加了条件后会使我们有所干扰。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LEN 2000
int a[] = {0, 1, 3, 56, 56, 100, 101, 102, 1000, 2000};
int b[] = {1, 45, 56, 56, 100, 1000};

char bit[LEN];
int clear(char *p, int len);
int setbit(char *p, int n);
int output(char *p, int len);

int main()
{
        char c;
        c = 1;

        clear(bit, LEN);
        int i;
        for(i = 0; i < sizeof(a) / sizeof(int); i++)
                setbit(bit, a[i]);
        for(i = 0; i < sizeof(b) / sizeof(int); i++)
                setbit(bit, b[i]);
        output(bit, LEN);
}

int clear(char *p, int len)
{
        memset(p, 0, len);
        return 0;
}
int setbit(char *p, int n)
{
        int pass = n / 8;
        n = n % 8;
        p += pass;
        n = 7 - n;
        *p = *p | (1 << n);
        return 0;
}
int output(char *p, int len)
{
        int i,k;
        char c, t;
        for(i = 0; i < len; i++)
        {
                c = *(p + i);
                for(k = 0; k < 8; k++)
                {
                        if((c >> (7 - k)) & 1 == 1)
                                printf("%d\n", i * 8 + k);
                }
        }
        return 0;
}


阅读(2463) | 评论(0) | 转发(0) |
0

上一篇:c 通用排序

下一篇:基数排序

给主人留下些什么吧!~~