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