牛客网
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中较大的。但是不能用任何比较判断。若两数相同,返回任意一个。
给定两个整数a和b,请返回较大的数。
测试样例:
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}; } }

浙公网安备 33010602011771号