zoukankan      html  css  js  c++  java
  • lc0314

    ✅ 1317. 将整数转换为两个无零整数的和

    https://leetcode-cn.com/problems/convert-integer-to-the-sum-of-two-no-zero-integers/

    描述

    「无零整数」是十进制表示中 不含任何 0 的正整数。

    给你一个整数 n,请你返回一个 由两个整数组成的列表 [A, B],满足:

    A 和 B 都是无零整数
    A + B = n
    题目数据保证至少有一个有效的解决方案。

    如果存在多个有效解决方案,你可以返回其中任意一个。

    示例 1:

    输入:n = 2
    输出:[1,1]
    解释:A = 1, B = 1. A + B = n 并且 A 和 B 的十进制表示形式都不包含任何 0 。
    示例 2:

    输入:n = 11
    输出:[2,9]
    示例 3:

    输入:n = 10000
    输出:[1,9999]
    示例 4:

    输入:n = 69
    输出:[1,68]
    示例 5:

    输入:n = 1010
    输出:[11,999]

    解答

    方法一:枚举
    由于题目中给出的 n 的范围 [2, 10000] 较小,因此我们可以直接在 [1, n) 的范围内枚举 A,并通过 n - A 得到 B,再判断 A 和 B 是否均不包含 0 即可。

    recurison with double 100%

    class Solution:
        def getNoZeroIntegers(self, n: int) -> List[int]:
            def valid(num):
                if num == 0:
                    return True
                resid = num % 10
                if resid == 0:
                    return False
                else:
                    return valid(num//10)
    
            for i in range(1, n):
                if valid(i) and valid(n-i):
                    return [i, n-i]
    
    

    c

    随机大法好

    class Solution {
    public:
        vector<int> getNoZeroIntegers(int n) {
            vector<int> ans;
            while(true){
                printf(" yout:>> %d", rand());
                int num1 = rand() % n + 1;
                int num2 = n - num1;
                string str1 = to_string(num1);
                string str2 = to_string(num2);
                if(str1.find('0') == str1.npos &&
                   str2.find('0') == str2.npos){
                       ans.push_back(num1);
                       ans.push_back(num2);
                       break;
                   }
            }
            return ans;
        }
    };
    /*执行用时 :
    0 ms
    , 在所有 C++ 提交中击败了
    100.00%
    的用户
    内存消耗 :
    8 MB
    , 在所有 C++ 提交中击败了
    100.00%
    的用户*/
    
    

    py

    class Solution:
        def getNoZeroIntegers(self, n: int) -> List[int]:
            def isNotContainZero(num: int):
                if '0' not in str(num):
                    return True
                else: 
                    return False
    
            for i in range(1, n):
                if isNotContainZero(i) and isNotContainZero(n - i):
                    return [i, n-i]
    
    '''
    执行用时 :
    52 ms
    , 在所有 Python3 提交中击败了
    10.38%
    的用户
    内存消耗 :
    13.4 MB
    , 在所有 Python3 提交中击败了
    100.00%
    的用户
    '''
    

    ✅ 389. 找不同

    https://leetcode-cn.com/problems/find-the-difference/

    描述

    给定两个字符串 s 和 t,它们只包含小写字母。

    字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。

    请找出在 t 中被添加的字母。

    示例:

    输入:
    s = "abcd"
    t = "abcde"

    输出:
    e

    解释:
    'e' 是那个被添加的字母。

    解答

    思路: 在t中不断 撤销 s 里面的字母就完事了。 py todo 啊

    他们思考好:

    class Solution {
        // 方式二:**异或**,两个相同元素异或之后的值是0,0和x(任何数)异或等于x,还有一点非常重要:就是不管两个相同的数是在什么时候异或的,最终的结果都会存在0
        // 我举个例子:假如有6个数字:2 3 4 4 3 2, 不管是2^3^4^4^3^2 还是我们经过处理之后组合起来 (2^2)^(3^3)^(4^4)结果都是一样的,不会影响结果
        // 那我们想下本题两个字符串中的字符,s和t中相同的字符都存在两个,将他们全部异或之后肯定为0,然后其中还有一个多出来的就成了0^x=x,从而得到结果,不知道大家理解没
        public char findTheDifference(String s, String t) {
            char result = 0;
            for (int i = 0; i < s.length(); i++){
                result ^= s.charAt(i);
            }
            for (int i = 0; i < t.length(); i++){
                result ^= t.charAt(i);
            }
    
            return result;
    ---
    
    1、字符串替换法:
    
    public static char findTheDifference(String s, String t) {
        for(Character c : s.toCharArray()){
            t = t.replaceFirst(c.toString(),"");
        }
        return t.toCharArray()[0];
    }
    2、Map计数法:
    
    public static char findTheDifference(String s, String t) {
        Character result = null;
        Map<Character, Integer> sMap = new HashMap<>();
        Map<Character, Integer> tMap = new HashMap<>();
        for (Character c : s.toCharArray()) {
            if (!sMap.containsKey(c)) {
                sMap.put(c, 0);
            }
            sMap.put(c, sMap.get(c) + 1);
        }
    
        for (Character c : t.toCharArray()) {
            if (!tMap.containsKey(c)) {
                tMap.put(c, 0);
            }
            tMap.put(c, tMap.get(c) + 1);
        }
    
        Set<Map.Entry<Character, Integer>> entries = tMap.entrySet();
        for (Map.Entry<Character, Integer> entry : entries) {
            Character key = entry.getKey();
            Integer value = entry.getValue();
            if (!value.equals(sMap.get(key))) {
                result = key;
                break;
            }
        }
        return result;
    }
    3、字符串ASCII差值法:
    
    public static char findTheDifference(String s, String t) {
        int sCount = 0;
        int tCount = 0;
        for (Character c : s.toCharArray()) {
            sCount += c;
        }
    
        for (Character c : t.toCharArray()) {
            tCount += c;
        }
    
        return (char)(tCount - sCount);
    }
    4、异或法:
    
    public static char findTheDifference(String s, String t) {
        int result = 0;
        for (Character c : s.toCharArray()) {
            result^=c;
        }
    
        for (Character c : t.toCharArray()) {
            result^=c;
        }
        return (char)result;
    }
    
    

    c

    
    

    py

    每一个字符都对应一个 ASCII 数字,那么那个不同的数字的 ASCII 码就等于 t 的所有字符码之和 - s 的
    ord 函数将单个字符转换为 ASCII 码, chr相反

    class Solution:
        def findTheDifference(self, s: str, t: str) -> str:
            return chr(sum(map(ord, t)) - sum(map(ord, s)))
    
    '''
    执行用时 :
    44 ms
    , 在所有 Python3 提交中击败了
    38.57%
    的用户
    内存消耗 :
    13.6 MB
    , 在所有 Python3 提交中击败了
    5.54%
    的用户
    '''
    
  • 相关阅读:
    Codeforces Round #644 (Div. 3)(A~G)
    【】BZOJ3687: 简单题(dp+bitset)
    [LeetCode] 275. H-Index II
    [LeetCode] 1028. Recover a Tree From Preorder Traversal
    [LeetCode] 1014. Best Sightseeing Pair
    [LeetCode] 468. Validate IP Address
    [LeetCode] 701. Insert into a Binary Search Tree
    [LeetCode] 658. Find K Closest Elements
    [LeetCode] 787. Cheapest Flights Within K Stops
    [LeetCode] 1300. Sum of Mutated Array Closest to Target
  • 原文地址:https://www.cnblogs.com/paulkg12/p/12493191.html
Copyright © 2011-2022 走看看