1、^运算 ,可以筛选出重复或不重复的数字,但必须是双数(A^A=0 B^0 = B)也有可能会开两个数组来比较,不一定在同一个数组中比较,灵活实现
2、辅助空间的开法是
int N=100;
int arr[] = new int[N];
int helper[] = new int[N];
for(i = 0;i<N;i++){
helper[arr[i]]++;//这里
}
3、将整数转化为二进制
System.out.println(Integer.toString(c,2));
4、一个比较神奇的结论 判断一个数是不是2的整数次方
(N&(N—1))==0 那就是 自己推一下
5、整数的奇偶位互换
第一种:char ss[] = str.toCharArray();//利用toCharArray方法转换 字符串转字符数组
第二种:用0做与运算是消除 用1做与运算是保留
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int i = scan.nextInt();
//保留奇数位
int odd = i&0xaaaaaaaa;
//保留偶数位
int even = i&0x55555555;
//交错按位与
System.out.println("奇偶位交换后为:"+((odd>>1)^(even<<1)));
}
}
6、 0~1间的浮点实数的二进制表示
例如:0.625 二进制表示为0.101
//0.625 表示为0.101
class Main{
public static void main(String[] args) {
double num = 0.625;
StringBuilder sb = new StringBuilder("0.");
while(num>0){
double r = num*2;
if(r>=1){
sb.append("1");
num = r-1;
}
else {
sb.append("0");
num =r;
}
if(sb.length()>34){
System.out.println("ERROR");
}
}
System.out.println(sb);
}
}
str+str时,,调换前后顺序可以起到正相加,,倒着相加的功能。
7、例如:一堆数字只有一个数字出现了一次,求那个出现了一次的数字
两个相同的二进制的数做不进位相加 结果为0
十个相同的十进制的数做不进位相加 结果为0
n个相同的n进制的数做不进位相加 结果为0
//一堆数组和一个数组 求那一个的数组
//都转化为三进制的,因为3个相同的三进制数字无进制相加和为0
class Main{
public static void main(String[] args) {
int [] arr = {2,2,2,7,7,7,9,3,3,3};
int len = arr.length;
char[][] wei = new char[len][];
int maxlength= 0;
for(int i=0;i<arr.length;i++){ //对于每个数字而言
wei[i]= new StringBuilder(Integer.toString(arr[i],3)).reverse().toString().toCharArray(); //StringBUild有toarray方法
if(wei[i].length>maxlength){
maxlength = wei[i].length; //找出最长的
}
}
int[] resArr = new int[maxlength];
for(int i=0;i<len;i++){ //开始不进位加法 ,这一步列举所有的
for(int j=0;j<maxlength;j++){ //每一位都要加上
if(j>=wei[i].length){
resArr[j]+= 0;
}else {
resArr[j] += (wei[i][j]-'0'); //那一位上是char
}
}
}
int res = 0;
for(int i=0;i<maxlength;i++){
res +=(resArr[i]%3)*(int)(Math.pow(3,i));
}
System.out.println(res);
}
}
例题:
1、两个整数A和B 需要改变几个二进位才能将a转化为b
import java.util.Scanner;
class Main{
public static void main(String[] args) {
int a,b;
Scanner sc = new Scanner(System.in);
a = sc.nextInt();
b = sc.nextInt();
int c = a^b; //亦或运算
int count=0;
while(c!=0){
c = (c&(c-1)); //判断二进制中有多少个1
count++;
}
System.out.println(count);
}
}
2、一个整型数组里除了两个数字(互不相同)之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
class Main{
public static void main(String[] args) {
int arr[] = {1,2,3,4,5,6,1,2,3,4,5};
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i:arr){
if(map.containsKey(i)){
map.put(i,map.get(i)+1);
}else {
map.put(i,1);
}
}
Set<Integer> set = map.keySet();
for(int i:set){
if(map.get(i) ==1){
System.out.println(i +" ");
}
}
}
}
位运算:
有一个博主写的特别好,我这里不太懂 https://www.cnblogs.com/hezhiyao/p/7539024.html
3、
地产大亨Q先生临终的遗愿是:拿出100万元给X社区的居民抽奖,以稍慰藉心中愧疚。
麻烦的是,他有个很奇怪的要求:
1. 100万元必须被正好分成若干份(不能剩余)。每份必须是7的若干次方元。比如:1元, 7元,49元,343元,...
2. 相同金额的份数不能超过5份。
3. 在满足上述要求的情况下,分成的份数越多越好!
请你帮忙计算一下,最多可以分为多少份?
解:
必须为7的倍数就是7进制数的问题,将1000000转换成7进制数,每一位的和就是分的分数的和。
题目中的不能超过5份是迷惑条件,因为某个数的七进制表示是唯一的,不受条件的限制。
class Main{
public static void main(String[] args) {
String s=Integer.toString(1000*1000,7);
int sum = 0;
for(int i=0;i<s.length();i++){
sum += s.charAt(i)-'0';
}
System.out.println(sum);
}
}