经典找不同(力扣389)

给定两个字符串 s 和 t ,它们只包含小写字母。字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。请找出在 t 中被添加的字母。      用c语言实现。


一、解法一:数组计数

char findTheDifference(char* s, char* t) {
    //[26]代表有26个元素,索引为0---25
    int arr[26] = {0};
    int len1 = strlen(s), len2 = strlen(t);
    for (int i = 0; i < len1; i++) {
        // 字符的ASCII码转换
        arr[s[i] - 'a']++;
    }
    for (int j = 0; j < len2; j++) {
        arr[t[j] - 'a']--;
    }
    for (int num = 0; num < 26; num++) {
        if (arr[num] == -1) { // 找到差异字符
            return num + 'a'; // 正确转换为字符
        }
    }
    // 字符 返回'\0'
    return '\0';
}

1.1思路

  1. 用一个大小为26的数组记录26个小写字母出现次数,初始化为0
  2. 遍历字符串s中的每个字符,对应数组中的位置加1
  3. 遍历字符串t中的每个字符,对应数组中的位置减1
  4. 遍历数组,找到值为-1的元素,对应的字符即为答案

1.2相关知识

1.2.1数组的定义和初始化    

int arr[26]={0}   :[26]代表有26个元素,索引为0---25;  内容全为0 

 

1.2.2字符的ASCII码转换

 ①ASCII 码将字符映射为 0-127 的整数值,例如:

  • 'a' → 97(小写字母从 a 到 z 对应 97-122

  • 'A' → 65(大写字母从 A 到 Z 对应 65-90

  • '0' → 48(数字从0 到 9 对应 48-57

② 字符 ↔ ASCII 码的转换

(1) 字符 → ASCII 码

直接通过 字符的算术运算 得到其 ASCII 码:

char c = 'a';
int ASCII_c = c; // ASCII_c = 97

(2) ASCII 码 → 字符

将整数强制转换为 char 类型,即可得到对应的 ASCII 字符:

int num = 97;
char c = (char)num; // c = 'a'

常见应用场景

(1) 字符到索引的转换

统计字母出现次数时,需要将字符映射到数组索引(a-z 对应 0-25):

char c = 'd';
int index = c - 'a'; // index = 3 ( 'd' - 'a' = 100 - 97 = 3)

(2) 索引到字符的还原

将索引反向转换为字符:

int index = 3;
char c = index + 'a'; // c = 'd' (3 + 97 = 100 → 'd')

(3) 大小写转换

  • 大写转小写:c = 'C' + 32 → 'c'(利用 'A' - 'a' = -32

  • 小写转大写:c = 'c' - 32 → 'C' 

 

1.2.3字符的空返回

默认返回值 ,即空字符'\0'

二、解法二: 异或

char findTheDifference(char* s, char* t) {
    int xor = 0;
    int len1 = strlen(s), len2 = strlen(t);
    for (int i = 0; i < len1; i++) {
        xor ^= s[i];
    }
    for (int i = 0; i < len2; i++) {
        xor ^= t[i];
    }
    return xor;
}

 

2.1异或(^)相关知识

2.1.1性质
  • 二进制位运算,两操作数 相同结果为0,不同结果为1
  • a^a=0:任何数与自身异或结果为 0a^0=a:任何数与 0 异或结果不变。

  • 可逆性:若c=a^b,则a=c^b,b=c^a。(常用于简单的加密与解密)

  • 异或的本质是二进制无进位加法,例如:

    5 (0101) + 3 (0011) = 6 (0110)  // 忽略所有进位
 2.1.2应用

交换两个变量的值(无需临时变量)

int a=3,b=5;
a = a ^ b;  // a = 3 ^ 5
b = a ^ b;  // b =(3 ^ 5) ^ 5 =  3
a = a ^ b;  // a =(3 ^ 5) ^ 3  = 7

找到唯一出现奇数次的元素

将数组中所有数异或,成对的数异或会抵消为0,最终剩下唯一的数

 int xor = 0;
 int len1 = strlen(s)
 for (int i = 0; i < len1; i++) {
     xor ^= s[i];
 }

三 、解法三:ASCII求和

char findTheDifference(char* s, char* t) {
    int ASCII_s = 0, ASCII_t = 0;
    int len1 = strlen(s), len2 = strlen(t);
    for (int i = 0; i < len1; i++) {
        ASCII_s += s[i];
    }
    for (int i = 0; i < len2; i++) {
        ASCII_t += t[i];
    }
    return (char)(ASCII_t - ASCII_s);
}

3.1思路

  • 求出t中所有字符的ASCII码之和ASCII_t 与 s中所有字符的ASCII码之和ASCII_s
  • 相减,得到的差值就是被添加的字符的ASCII码

你可能感兴趣的:(力扣题目,leetcode,算法,数据结构)