1.蓝桥杯算法
1、位运算
1.1
第一种思路:
-
利用异或 假设异或符号是& 1&1=0 1&0=1;
-
(1&2&3&…&k&k&…1000)&(1…&k…&1000)=k
-
a=a^b ; ------------ 01=10^11
public class test {
public static void main(String[] args) {
int n=11;
int [] arr=new int[n];
//创建一个长度为n的数组,放有数字123..n-1
for (int i = 0; i < arr.length - 1; i++) {
arr[i]=i+1;
}
//生成一个<n的随机数放入arr【n-1】;
arr[arr.length-1]=new Random().nextInt(n);
int x=0;
//将123...n-1进行异或
for (int i = 1; i <= n-1; i++) {
x=x^i;
}
//打印数组
for (int i = 0; i < n ; i++) {
System.out.print(arr[i]+" ");
}
//再进行全部异或得出x
for (int i = 0; i < n; i++) {
x=x^arr[i];
}
System.out.println(x);
}
}
第二种简单的思路
将数组内数字相加 再减去 1…1000的总和
第三种思路
假如借助辅助空间
int [] arr1=new int[n];
for (int i = 0; i < n; i++) {
arr1[arr[i]]++;
}
for (int i = 0; i < n; i++) {
if (arr1[i]==2)
System.out.println(i);
}
1.2
思路:将这里面的数进行异或 相同为0 不同为1 所以最终保留本身
1.3
public class 输入一个数计算在二进制数中1的个数 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
System.out.println(Integer.toString(n,2));
int count=0;
for (int i = 0; i < 32; i++) {
if((n&(1<<i))==(1<<i)){
count++;
}
}
System.out.println(count);
//解法2:将n进行右移做&运算
count=0;
for (int i = 0; i < 32; i++) {
if(((n>>>i)&1)==1){
count++;
}
}
System.out.println(count);
//解法3:将n-1与n作&运算
count=0;
while (n!=0){
n=(n-1)&n;
count++;
}
System.out.println(count);
}
}
1.4
题目:用一条语句判断一个整数是不是2的整数次方
public class 用一条语句判断一个整数是不是2的整数次方 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
if ((n=(n-1)&n)==0){
System.out.println("是2的整数次方");
}
else{
System.out.println("不是2的整数次方");
}
//解法2
int n1=sc.nextInt();
int count=0;
for (int i = 0; i <32; i++) {
if(((n1>>i)&1)==1){
count++;
}
}
if(count==1){
System.out.println("是2的整数次方");
}
else{
System.out.println("不是2的整数次方");
}
}
}
1.5
题目:将一个数的二进制数进行奇偶位互换
public class 将一个数的二进制数进行奇偶位互换 {
public static void main(String[] args) {
int a=66;
int x=m(a);
String s = Integer.toString(a, 2);
String s1 = Integer.toString(x, 2);
System.out.println(s+"\n"+s1);
}
private static int m(int i){
int ou=i&0xaaaaaaaa;//和1010 1010 1010 1010....进行与运算取出偶数位
int ji=i&0x55555555;//和0101 0101 0101 0101....进行与运算取出奇数位
return (ou>>1)^(ji<<1);//将偶数位后移一位,与奇数位前移一位做 异或运算 得出奇偶交换
}
}
1.6
public class 零到1之间的数用二进制进行表示 {
public static void main(String[] args) {
StringBuilder sb=new StringBuilder("0. ");
double num=0.125;
int r=0;
while (num>0){
num*=2;
if (num>=1){
num=num-1;
sb.append("1");
}
else {
sb.append("0");
}
if (sb.length()>34){
System.out.println("error");
return;
}
}
System.out.println(sb.toString());
}
}
1.7
public class 数组中有1个数出现了一次其他数出现了k次求出现一次的数 {
public static void main(String[] args) {
int []arr={2,2,2,9,7,7,7,3,3,3,6,6,6,0,0,0};
int len=arr.length;
char[][] kRadix=new char[len][];
int k=3;
int maxlen=0;
for (int i = 0; i < len; i++) {
kRadix[i]=new StringBuilder(Integer.toString(arr[i],k)).reverse().toString().toCharArray();
if(kRadix[i].length>maxlen)
maxlen=kRadix[i].length;
}
int [] resArr=new int[maxlen];
//利用断点逐步分析
for (int i=0;i<len;i++){
for (int j = 0; j <maxlen ; j++) {
if(j>=kRadix[i].length)
resArr[j]+=0;
else
resArr[j]+=(kRadix[i][j]-'0');
}
}
int res=0;
for (int i = 0; i < maxlen; i++) {
res+=(resArr[i]%k)*(int)(Math.pow(k,i));
}
System.out.println(res);
}
}