1. 题目(65)整数的各位积和之差
题目链接:整数的各位积和之差
给你一个整数 n,请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。
-
示例 1:
输入:n = 234
输出:15
解释:
各位数之积 = 2 * 3 * 4 = 24
各位数之和 = 2 + 3 + 4 = 9
结果 = 24 - 9 = 15 -
示例 2:
输入:n = 4421
输出:21
解释:
各位数之积 = 4 * 4 * 2 * 1 = 32
各位数之和 = 4 + 4 + 2 + 1 = 11
结果 = 32 - 11 = 21
提示:
1 <= n <= 10^5
2. 解题思路
-
首先定义了两个变量 sum 和 sum1,分别用于存储各位数字之和和各位数字之积。
-
然后通过一个循环对输入的整数 n 进行处理,每次迭代中,取 n 的个位数字,分别将其累加到 sum 中,并乘到 sum1 中,然后将 n 除以 10,以便在下一次循环中处理下一位数字。
-
最终,返回 sum1 - sum,即为各位数字之积与各位数字之和的差值。
3. 代码
int subtractProductAndSum(int n){
int sum = 0;//各位数字之和
int sum1 = 1;//各位数字之积
while(n) {
sum += n%10;
sum1 *= n%10;
n/=10;
}
return sum1-sum;
}
4. 题目(66)统计一致字符串的数目
题目链接:统计一致字符串的数目
给你一个由不同字符组成的字符串 allowed 和一个字符串数组 words 。如果一个字符串的每一个字符都在 allowed 中,就称这个字符串是 一致字符串 。
请你返回 words 数组中 一致字符串 的数目。
-
示例 1:
输入:allowed = “ab”, words = [“ad”,“bd”,“aaab”,“baa”,“badab”]
输出:2
解释:字符串 “aaab” 和 “baa” 都是一致字符串,因为它们只包含字符 ‘a’ 和 ‘b’ 。 -
示例 2:
输入:allowed = “abc”, words = [“a”,“b”,“c”,“ab”,“ac”,“bc”,“abc”]
输出:7
解释:所有字符串都是一致的。 -
示例 3:
输入:allowed = “cad”, words = [“cc”,“acd”,“b”,“ba”,“bac”,“bad”,“ac”,“d”]
输出:4
解释:字符串 “cc”,“acd”,“ac” 和 “d” 是一致字符串。
提示:
1 <= words.length <= 104
1 <= allowed.length <= 26
1 <= words[i].length <= 10
allowed 中的字符 互不相同 。
words[i] 和 allowed 只包含小写英文字母。
5. 解题思路
总的思路就是通过两层循环遍历allowed和words,利用一个辅助数组记录allowed中的字符出现情况,然后逐个判断每个字符串是否满足要求。最后统计满足要求的字符串的数量并返回。
-
首先,定义一个长度为26的整型数组hash1,用来记录allowed中的字符是否出现。
-
然后,通过遍历allowed字符串,将其中出现的字符的对应数组元素设为1。
-
接下来,通过两层循环遍历words字符串数组。对于每个字符串,它会遍历字符串的每个字符,并通过hash1数组判断字符是否在allowed中出现。如果有任何一个字符不在allowed中出现,那么flg变量就会被设为0,表示该字符串不满足要求。
-
内层循环结束后如果 flg 为1,说明该单词中的所有字符都在允许的字符集合中,则将 sum 自增1。
-
最后返回sum作为结果。
6. 代码
int countConsistentStrings(char * allowed, char ** words, int wordsSize){
int hash1[26] = { 0 };
int sum = 0;
for(int i = 0; i < strlen(allowed); i++) {
if(hash1[allowed[i] - 'a'] == 0) {
hash1[allowed[i] - 'a'] = 1;
}
}
for(int i = 0; i < wordsSize; i++) {
int flg = 1;
for(int j = 0; j < strlen(words[i]); j++) {
if(hash1[words[i][j] - 'a'] == 0) {
flg = 0;
break;
}
}
if(1 == flg) {
sum++;
}
}
return sum;
}