牛客网

2交换运算

请编写一个算法,不用任何额外变量交换两个整数的值。

给定一个数组num,其中包含两个值,请不用任何额外变量交换这两个值,并将交换后的数组返回。

测试样例:
[1,2]
返回:[2,1]
import java.util.*;
 
public class Swap {
    public int[] getSwap(int[] num) {
        num[0] = num[0] + num[1];
        num[1] = num[0] - num[1];
        num[0] = num[0] - num[1];
        return num;
    }
}

 

import java.util.*;
 
public class Swap {
    public int[] getSwap(int[] num) {
       num[0] = num[1]^num[0];
       num[1] = num[0]^num[1];
       num[0] = num[0]^num[1];
       return num;
    }
}

3比较

对于两个32位整数a和b,请设计一个算法返回a和b中较大的。但是不能用任何比较判断。若两数相同,返回任意一个。

给定两个整数ab,请返回较大的数。

测试样例:
1,2
返回:2
import java.util.*;
 
public class Compare {
  public static int sign(int a){
      return (a >> 31);
    }
    public int getMax(int a, int b) {
      int m = sign(a);
      int n = sign(b);
      if(m * n < 0) return (m+1)*a + (n+1)*b;
      int res = a - b;
      if(sign(res) == 0) return a;
      else return b;
    }
}

 

import java.util.*;
 
public class Compare {
    public int sig(int c){
        return ((c>>>31)&1)==0?1:0;
    }
    public int nsig(int c){
        return sig(c)==0?1:0;
    }
    public int getMax(int a, int b) {
        // write code here
        int c = a-b;
        int sigc = sig(c);
        int nsigc = nsig(c);
        return a*sigc+nsigc*b;
    }
}

 

import java.util.*;
 
public class Compare {
    public int getMax(int a, int b) {
        // write code here
        int c = a - b;
        int returnC = (c >> 31) & 1;
        int returnB = returnC ^ 1;
        return a*returnB + b*returnC;
    }
}

 

import java.util.*;
 
public class Compare {
    public static int flip(int n){
        return n^1;//若是负数则为0
    }
    public static int sign(int n){
        return flip((n>>31)&1);//负数符号位为1,做&运算保留,经过flip得0
    }
    public static int getMax(int a, int b) {
        int a0=sign(a);//a的符号,1代表正数
        int b0=sign(b);//b的符号,0代表负数
        int c0=sign(a-b);
        int difSab=a0^b0;//a,b符号是否相同,相同为0,不同为1
        int sameSab=flip(difSab);//a,b符号不同为0
        int returnA=difSab*a0+sameSab*c0;
        int returnB=flip(returnA);
        return a*returnA+b*returnB;
         
    }
    public static void main(String[]args){
       System.out.println(getMax(1,2));
    }
}

import java.util.*;
 
public class Compare {
    public int flip(int n) {
        return n ^ 1;
    }
  
    public int sign(int n) {
        return flip((n >> 31) & 1);
    }
  
    public int getMax(int a, int b) {
        int c = a - b;
        int sa = sign(a);
        int sb = sign(b);
        int sc = sign(c);
        int difSab = sa ^ sb;
        int sameSab = flip(difSab);
        int returnA = difSab * sa + sameSab * sc;
        int returnB = flip(returnA);
        return a * returnA + b * returnB;
    }
}

4寻找奇数出现

有一个整型数组A,其中只有一个数出现了奇数次,其他的数都出现了偶数次,请打印这个数。要求时间复杂度为O(N),额外空间复杂度为O(1)。

给定整形数组A及它的大小n,请返回题目所求数字。

测试样例:
[1,2,3,2,1],5
返回:3
import java.util.*;
 
public class OddAppearance {
    public int findOdd(int[] A, int n) {
        // write code here
        int eo = 0;
        for(int i=0;i<n;i++)
            {
            eo = eo^A[i];
        }
        return eo;
    }
}

 

import java.util.*;
 
public class OddAppearance {
    public int findOdd(int[] A, int n) {
        // write code here
        int res = 0;
        for(int a : A) {
            res ^= a;
        }
        return res;
    }
}

5寻找两个奇数出现

给定一个整型数组arr,其中有两个数出现了奇数次,其他的数都出现了偶数次,找到这两个数。要求时间复杂度为O(N),额外空间复杂度为O(1)。

给定一个整形数组arr及它的大小n,请返回一个数组,其中两个元素为两个出现了奇数次的元素,请将他们按从小到大排列。

测试样例:
[1,2,4,4,2,1,3,5],8
返回:[3,5]
import java.util.*;
 
public class OddAppearance {
    public int[] findOdds(int[] arr, int n) {
       int e0 = 0;
        int e1 = 0;
 
        for (int i = 0; i < n; i++) {
            e0 = e0 ^ arr[i];
        }
        int rightOne = e0 & (~e0 + 1);
        for (int cur : arr) {
            if ((cur & rightOne) != 0) {
                e1 ^= cur;
            }
        }
        int small = Math.min(e1, (e0 ^ e1));
        int big = Math.max(e1, (e0 ^ e1));
        return new int[]{small, big};
    }
}

 

posted @ 2017-05-19 18:17  临江仙zhe  阅读(90)  评论(0)    收藏  举报