zoukankan      html  css  js  c++  java
  • 2020-12-18 找不同

    题目


    题解

    方法一:哈希表

    建立一个哈希表,以字符为键,以整数为值(初值为0),对于字符串(t)中的每个字符,将哈希表以该字符为键的表项的值加1;然后对于字符串(s)的每个字符,将哈希表中以该字符为键的表项的值减1;如此一来在哈希表中只有以新增字符为键的表项的值大于0,返回该字符。

    class Solution {
    public:
        char findTheDifference(string s, string t) {
            unordered_map<char, int> imap;
            int len = s.size();
            for (int i = 0; i < len; ++i) {
                imap[t[i]] += 1;
                imap[s[i]] -= 1;
            }
            imap[t[len]] += 1;
            
            for (int i = 0; i < len+1; ++i) {
                if(imap[t[i]] > 0)
                    return t[i];
            }
    
            return ' ';
        }
    };
    

    方法二:两和之差

    使用两个变量sum_ssum_t分别记录字符串(s)与字符串(t)的所有字符的(ASCII)值之和,返回以sum_ssum_t的差值。

    class Solution {
    public:
        char findTheDifference(string s, string t) {
            int sum_s = 0, sum_t = 0;
            int len = s.size();
            for (int i = 0; i < len; ++i) {
                sum_s += s[i];
                sum_t += t[i];
            }
            sum_t += t[len];
    
            return char(sum_t - sum_s);
        }
    };
    

    方法三:位运算

    由于字符串(s)与字符串(t)的唯一区别在于新增字符,那么可对两字符串的所有与字符进行异或,最后的结果便是新增字符。这是为什么呢?
    自身异或结果为0:ch ^ ch = 0,并且异或服从交换律:ch1 ^ ch2 ^ ch3 = ch1 ^ ch3 ^ ch2
    以字符串ab和字符串abc来举例,二者所有元素的异或为:a^b^a^b^c,根据交换律可写成a^a^b^b^c,根据自身异或结果为0可写成0^c,其结果为c,这正是新增的字符。

    class Solution {
    public:
        char findTheDifference(string s, string t) {
            int ret = 0;
            int len = s.size();
            for (int i = 0; i < len; ++i) {
                ret = ret ^ s[i] ^ t[i];
            }
            
            return ret ^ t[len];
        }
    };
    

    总结

    做完题目后,我去查找“位运算为什么效率更高?”这个问题,我发现:位运算不一定就更比常规的程序执行效率更优,这种“奇技淫巧”编译器会自动给你做了。
    https://www.zhihu.com/question/364629487

    CS专业在读,热爱编程。
    专业之外,喜欢阅读,尤爱哲学、金庸、马尔克斯。
  • 相关阅读:
    [转]windows Mobile使用ActiveSync上网
    C++剪切板操作
    jdk1.8源码分析hashMap
    【杂项】VMware 虚拟机安装ubuntu 16.04教程
    【Linux命令】数据流重定向
    【ceph | 运维】crush相关命令
    【Linux命令】更改hostname
    【Linux命令】sed命令
    【Linux命令】vim基本快捷键
    【Linux命令】install
  • 原文地址:https://www.cnblogs.com/jmhwsrr/p/14156776.html
Copyright © 2011-2022 走看看