classSolution: defcountCharacters(self, words: List[str], chars: str) -> int: result = 0 for w in words: for i in w: if w.count(i) <= chars.count(i): flag = 1 else: flag = 0 break if flag == 1: result += len(w) return result
6.优美的排列
6.1题目描述
给定两个整数 n 和 k,你需要实现一个数组,这个数组包含从 1 到 n 的 n 个不同整数,同时满足以下条件:
#include<stdio.h> #include<stdlib.h> /** * Note: The returned array must be malloced, assume caller calls free(). */ int* constructArray(int n, int k, int* returnSize){ int i = 0; returnSize = (int* )malloc(n*sizeof(int)); int numK = k + 1, numTemp = 1; //下标段[0, k]中,偶数下标填充[1,2,3..] for (i = 0; i <= k; i += 2){ returnSize[i] = numTemp++; } //下标段[0, k]中,奇数下标填充[k + 1, k, k - 1...] for (i = 1; i <= k; i += 2){ returnSize[i] = numK--; } //下标段[k + 1, n - 1]都是顺序填充 for (i = k + 1; i < n; ++i) { returnSize[i] = i + 1; } return returnSize; } intmain(){ int* returnSize; int n,k,i; scanf("%d%d",&n,&k); returnSize=constructArray(n,k,returnSize); for(i = 0;i < n;i++){ printf("%d ",returnSize[i]); } free(returnSize); return0; }
自己运行的结果是对的,但是oj平台一直显示溢出,不知道啥原因,内存分配和访问都没问题啊,蜜汁操作。
7.旋转数字
7.1题目描述
我们称一个数 X 为好数, 如果它的每位数字逐个地被旋转 180 度后,我们仍可以得到一个有效的,且和 X 不同的数。要求每位数字都要被旋转。
classSolution: defrotatedDigits(self, N: int) -> int: s1 = '2569018' s2 = '2569' result = 0 for j inrange(0,N+1): flag1,flag = 0,0 sN = str(j) for i in sN: if i in s1 : flag1 = 1 if i in s2: flag = 1 else: flag = 0 break if flag == 1and flag1 == 1: result+=1 return result
7.4最优解
思路 根据好数定义,每个好数只能包含数字 0125689,并且至少包含 2569 中的一个。因此可以逐个写出小于等于 N 的所有好数。 这道题目可以使用动态规划解答。状态可以表示为三个变量 i, equality_flag, involution_flag。其中 i 表示当前正在写第 i 位数字;equality_flag 表示已经写出的 j 位数字是否等于 N 的 j 位前缀;involution_flag 表示从最高位到比当前位高一位的这段前缀中是否含有 2569 中的任意一个数字。 dp(i, equality_flag, involution_flag) 表示在特定 equality_flag,involution_flag 的状态下,有多少种从 i 到末尾的后缀能组成一个好数。最终的结果为 dp(0, True, False)。 注:数字 N 从最高位到最低位的索引,从 0 开始,并依次增大。第 i 位表示索引为 i 的位置。 算法 如果 equality_flag 为 true,表示第 i 位能取到的最大数字为 N 的第 i 位对应的数字。并且还需要根据当前状态决定可以写哪些数字。 在代码实现中,我们分别使用了自顶向下的方法和自底向上的方式。Python 代码实现的是自顶向下的方法,从 for d in xrange(…) 到 memo[…] = ans 这四行代码清晰的说明了状态之间的递归关系。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
classSolution(object): defrotatedDigits(self, N): A = map(int, str(N))
memo = {} defdp(i, equality_flag, involution_flag): if i == len(A): return +(involution_flag) if (i, equality_flag, involution_flag) notin memo: ans = 0 for d in xrange(A[i] + 1if equality_flag else10): if d in {3, 4, 7}: continue ans += dp(i+1, equality_flag and d == A[i], involution_flag or d in {2, 5, 6, 9}) memo[i, equality_flag, involution_flag] = ans return memo[i, equality_flag, involution_flag]