面试题 05.07. 配对交换

Difficulty: **配对交换。编写程序,交换某个整数的奇数位和偶数位,尽量使用较少的指令(也就是说,位0与位1交换,位2与位3交换,以此类推)。 示例1: 输入:num = 2(或者0b10) 输出 1 (或者 0b01) 示例2: 输入:num = 3 输出:3 提示: num的范围在[0, 2^30 - 1]之间,不会发生整数溢出。 **

配对交换。编写程序,交换某个整数的奇数位和偶数位,尽量使用较少的指令(也就是说,位0与位1交换,位2与位3交换,以此类推)。

示例1:

1
2
 输入:num = 2(或者0b10)
 输出 1 (或者 0b01)

示例2:

1
2
 输入:num = 3
 输出:3

提示:

  1. num的范围在[0, 2^30 - 1]之间,不会发生整数溢出。

Solution

Language: ****

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
func exchangeBits(num int) int {

   return handle(num)
}
func reverse(arr []int) {
	i := 0
	j := len(arr) - 1
	for i < j {
		arr[i], arr[j] = arr[j], arr[i]
		i++
		j--
	}
}

func handle(num int) int {

	var v []int
	for num != 0 {
		v = append(v, (num % 2))
		num /= 2
	}
    reverse(v)
	if len(v)%2 != 0 {
		reverse(v)
		v = append(v, 0)
		reverse(v)
	}
   // fmt.Println(v)
    //reverse(v)
	for i := 0; i < len(v)-1 ; i += 2 {
		v[i], v[i+1] = v[i+1], v[i]
	}
	//reverse(v)
  //  fmt.Println(v)
	// 二进制转十进制
	var res = 0
	
	for i := 0; i < len(v); i++ {
		res = res*2 + v[i]
	}
	return res
}