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%
的用户
'''

posted on 2020-03-14 17:35  Paulkg12  阅读(127)  评论(0编辑  收藏  举报

导航