package aa;
/**
* 第二个,集合
*1.给定集合A{0,1,2.....30,31}
*2.给定集合B{5,6....10,11}
*3.求 A 和 B 的交集
*4.求 A 和 B 的并集
*5.求 B 相对于 A 的补集
*6.求 A 对 B 差集
*7.求给定集合 C{7,9} 是 A 和 B 哪个集合的子集,并实现任意集合子集的查询功能
*8.以上所有集合必须使用一个int表示而非数组,所有代码均以按位运算符进行
*9.使用查表法可以根据int表示的集合正确输出该集合所表示的数组。
*10.必须详细写出解题思路,实现方法。去工作之后,你写的代码不是给你自己看的,是给别人看的,你不写设计思路,不写注释,你让人怎么看?
*
*思路 int变量的每位分别代表1到31个元素 由于这里只有0到31所以最低为代表0 最高位代表31 当那为为1代表这个集合里有这个数
*为0代表集合里没这个数
*集合A用int变量listA表示的话为每位都是1所以为-1
*集合B用int变量listB表示的话为5到11位
*求A和B的交际 就是listA&listB的结果位数为1的就是交际
*/
public class MyListDemo {
public static void main(String[] args) {
int listA=-1;
//集合b是5到11 所以我拿12位表示它 因为重0开始 由于这个集合头前五位是0
//地6为到12为1 用16进制表示为0xfe0我拿这个数|上0就是我要的数了
int listB=0|0xfe0;
//求listA与listB的交际 拿listA&上listB 定义一个int型变量存储交集
int jiaoJi=listA&listB;
//应为是交际而listB的元素是5到11所以取出6到12位中改位为1的数在-1即可
System.out.println("交集为:");
get(jiaoJi,6,12);
int bingJi=listA|listB;
//并集拿2个集合代表的数进行或运算就可以了 次数为大的集合1到32
System.out.println("并集为:");
get(bingJi,1,32);
System.out.println("补集为:");
//补集listA有的listB没有 ^是2进制位相同为0不同为1 应为listA所有位都是1所以不会
//出现listB有的listA没有
int buJi=listA^listB;
get(buJi,1,32);
//求给定集合 C{7,9} 是 A 和 B 哪个集合的子集
//先创建个c集合 每个16进制位代表4位
//集合c和集合A,B&操作 8到10位为1那么就是它的子集
int listC=0|0x380;
if (contains(listC&listA,8,10)){
System.out.println("listC是listA的子集");
}
if (contains(listC&listB,8,10)){
System.out.println("listC是listB的子集");
}
// System.out.println(Integer.toBinaryString());
}
/**
* @param list
* @param start
* @param end
* @return
*/
static boolean contains(int list,int start,int end){
boolean flag=false;
if(get(list,start,end,true)){
flag=true;
}
return flag;
}
/**
* 把int集合所带表的集合的元素循环拿出来
* 从list集合里面的指针为start-1处开始check匹配到end处当符合要求就打印出来
* flag 为true的话就不打印当匹配不成功的话就把ret设置为false退出循环换回ret
*/
static boolean get(int list,int start,int end,boolean flag){
boolean ret=false;
int arg=(start/start)<<start-1;
for(int row=start;row<=end;row++){
if(check(list,arg)){
if(flag){
arg<<=1;
ret=true;
continue;
}
System.out.print(row-1+" ");
}
if(flag){
ret=false;
break;
}
arg<<=1;
// System.out.println(arg);
}
return ret;
}
/**
* 打印集合中的数
*/
static void get(int list,int start,int end){
get(list,start,end,false);
//没打印完一个空行一次
System.out.println();
}
/**
* 用于检测元素是否存在
* 判断该位是否有元素只需要用那位为1其他未为0的数&int集合在看结果是否等于&操作的数
*/
static boolean check(int list,int arg){
boolean flag=false;
list=list&arg;
if(list==arg){
flag=true;
// System.out.println(list==arg);
}
return flag;
}
}
|