Leecode刷题C语言之使两个整数相等的位更改次数

执行结果:通过

执行用时和内存消耗如下:

Leecode刷题C语言之使两个整数相等的位更改次数_第1张图片

题目:超级饮料的最大强化能量

给你两个正整数 n 和 k。你可以选择 n 的 二进制表示 中任意一个值为 1 的位,并将其改为 0。返回使得 n 等于 k 所需要的更改次数。如果无法实现,返回 -1。

示例 1:

输入: n = 13, k = 4

输出: 2

解释:
最初,n 和 k 的二进制表示分别为 n = (1101)2 和 k = (0100)2

我们可以改变 n 的第一位和第四位。结果整数为 n = (0100)2 = k

示例 2:

输入: n = 21, k = 21

输出: 0

解释:
n 和 k 已经相等,因此不需要更改。

解题思路: 

  1. 定义全局字符数组
    • char binary_m[32]; 和 char binary_n[32]; 用于存储两个整数(m 和 n)的32位二进制表示。
  2. 函数 printBinary(int m, char *binary)
    • 这个函数接收一个整数 m 和一个字符数组 binary 作为参数。
    • 初始化数组:首先,通过循环将 binary 数组的所有元素初始化为 '0'。数组大小为32,代表32位二进制数。
    • 处理负数:通过将 m 转换为 unsigned int 类型的 value,避免了负数在二进制表示中的符号位问题(在32位无符号整数中,负数的二进制表示会自然转换为其对应的二进制补码形式)。
    • 整数转二进制:通过不断除以2并取余数的方法,将 value 转换为二进制,并从数组的最高位(索引31)开始填充。
    • 打印二进制表示:遍历 binary 数组,打印每一位。为了易于阅读,每4位后添加一个空格。
  3. 函数 minChanges(int m, int n)
    • 这个函数接收两个整数 m 和 n 作为参数。
    • 使用 printBinary 函数将 m 和 n 转换为它们的二进制表示,并存储在 binary_m 和 binary_n 中。
    • 初始化计数器 count 为0,用于记录需要改变的位数。
    • 遍历 binary_m 和 binary_n 的每一位(从索引0到31):
      • 如果对应位置的字符相同,则不增加计数器。
      • 如果不同,检查 binary_m 的当前字符是否为 '0'(这里使用 0x30,即字符'0'的ASCII码)。理论上,这个检查是不必要的,因为 binary_m 只会被填充 '0' 或 '1',但可能是为了代码的健壮性而添加。如果找到了非 '0' 或 '1' 的字符,函数返回-1。
      • 如果不同且 binary_m 的当前字符是 '0' 或 '1',则增加计数器。
    • 返回计数器 count 的值,表示将 m 的二进制表示转换为 n 的二进制表示所需的最少位变化次数。
char binary_m[32];
char binary_n[32];
    
void printBinary(int m, char * binary) {
    // 定义一个字符数组来存储二进制表示

    int index = 31;
    // 初始化数组
    for (int i = 0; i < 32; i++) {
        binary[i] = '0';
    }
    
    // 处理负数的情况
    unsigned int value = (unsigned int)m;
    
    // 将整数转换为二进制
    while (value > 0) {
        binary[index--] = (value % 2) ? '1' : '0';
        value /= 2;
    }
    
    // 打印二进制表示
    for (int i = 0; i < 32; i++) {
        printf("%c", binary[i]);
        // 每4位增加一个空格,便于阅读
        if ((i + 1) % 4 == 0) {
            printf(" ");
        }
    }
    printf("\n");
}

int minChanges(int m, int n) {
    printBinary(m, binary_m);
    printBinary(n, binary_n);
    int count=0;
    for (int i=0; i<=31;i++){
        if(binary_m[i]==binary_n[i]){
            count = count;
        }else{
            if(binary_m[i] == 0x30){
                return -1;
            }
            count++;
        }
    } 
    return count;
}

你可能感兴趣的:(c语言,开发语言)