1. 小红的二叉树计数
小红定义一个二叉树为“好二叉树”,当且仅当该二叉树所有节点的孩子数量为偶数(0或者2)。
小红想知道,n个节点组成的好二叉树,共有多少种不同的形态?1≤n≤3000
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型
* @return int整型
*/
long divide = 1000000007;
public int cntOfTrees(int n) {
if (n % 2 == 0) { //偶数必然不行
return 0;
}
long sum[] = new long[3001]; //创建了一个长整型数组 sum,长度为 3001
sum[1] = 1; //初始化 sum[1] 和 sum[3] 为 1
sum[3] = 1;
for (int i = 5; i <= n; i += 2) { //步长为 2,即只考虑奇数
int nodeNum = i - 1;
//分别去分配左右子树的节点数量
//从j = 1开始,每次增加 2,直到 j<nodeNum, 这意味着循环会遍历左子树的节点数量
for (int j = 1; j < nodeNum; j += 2) {
sum[i] += (sum[j] * sum[nodeNum - j]) % divide;
//左子树节点数量j 、右子树节点数量nodeNum - j
sum[i] %= divide;
}
}
return (int) sum[n];
}
}
2. 小红的可爱串
小红定义一个字符串是可爱串,当且仅当该字符串包含子序列"red",且不包含子串"red"。
我们定义子序列为字符串中可以不连续的一段,而子串则必须连续。例如rderd包含子序列"red",且不包含子串"red",因此该字符串为可爱串。
小红想知道,长度为n的、仅由'r'、'e'、'd'三种字母组成的字符串中,有多少是可爱串?
1≤n≤10的5次方
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型
* @return int整型
*/
public int kawaiiStrings (int n) {
// write code here
long mod = (long)Math.pow(10, 9) + 7;
long[] f = new long[n + 1]; //创建了三个长整型数组 f、g 和 h,长度都为 n + 1
long[] g = new long[n + 1];
long[] h = new long[n + 1];
//powMod是一个静态方法,用于计算模幂运算
for (int i = 2; i <= n; i++) {
g[i] = (g[i - 1] * 2) % mod + ((i - 1) * powMod(2, i - 2, mod)) % mod;
g[i] %= mod;//将结果对 mod 取余保证在模数范围内
}
for (int i = 2; i <= n; i++) {
f[i] = (f[i - 1] * 3) % mod + g[i - 1] % mod;
f[i] = (f[i - 1] * 3) % mod + g[i - 1] % mod;
f[i] %= mod;
}
for (int i = 3; i <= n; i++) {
h[i] = powMod(3, i - 3, mod) + 3 * h[i - 1] % mod + mod - h[i - 3];
h[i] %= mod;
}
return (int)((f[n] + mod - h[n]) % mod);
}
public static long powMod(long a, long b, long mod) {
long m = a;
long n = b;
long res = 1;
while (n > 0) {
if ((n & 1) == 1) {
res = res * m % mod;
res %= mod;
}
n >>= 1;
m = m * m % mod;
}
return res;
}
}
3. 小红的元素乘积
小红定义一个数为“完美数”,当且仅当该数仅有一个非零数字。
例如 5000, 4, 1, 10, 200都是完美数。
小红拿到了一个大小为n的数组,她希望选择两个元素,满足它们的乘积为完美数。
小红想知道,共有多少种不同的取法?
数据范围: 1≤n≤2000 1≤a的i次方≤10的9次方
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param arr int整型一维数组
* @return int整型
*/
public int perfectPair(int[] arr) {
int ans = 0;
// 遍历数组中的所有可能的数对
for (int i = 0; i < arr.length; ++i) {
for (int j = i + 1; j < arr.length; ++j) {
//计算当前数对的乘积,并将结果转换为字符串。然后,将字符串转换为字符数组
long v = (long) arr[i] * arr[j];
String s = String.valueOf(v);
char[] charArray = s.toCharArray();
int x = 0, y = 0; // x计数'0'的数量,y计数非'0'的数量
for (int k = 0; k < s.length(); ++k) {
if (charArray[k] == '0') ++x;
else ++y;
}
// 完成对整个字符串的遍历后,判断是否满足只有一个非'0'字符和至少一个'0'字符的条件
if (y == 1 && x + y == charArray.length) {
++ans;
}
}
}
return ans;
}
}