第一场(11.17)
A、最小差值
暴力解法:
public int minDifference (int[] a) {
int res = Integer.MAX_VALUE;
for(int i = 0; i < a.length-1; i++){
for(int j = i+1; j < a.length; j++){
res = Math.min(res,Math.abs(a[j]-a[i]));
}
}
return res;
} 先排序,再比较
public int minDifference (int[] a) {
Arrays.sort(a);
int res = Integer.MAX_VALUE;
for(int i=1;i<a.length;++i){
if(a[i]-a[i-1] >=0){
res = Math.min(res,a[i]-a[i-1]);
}
}
return res;
} B、TreeIV
题目分析: 观察所形成的完全二叉树,我们不难发现,此时全部结点构成了一个公差为1的等差数列。但是由于每一层的深度都不一样,所以我们把它转化为每一层的等差数列进行求解。
形成的完全二叉树,我们可以观察到每一层的最左边的结点是全是偶数,最右边的结点全是奇数,所以就有了计算每一层等差数列的起点和终点的公式。
等差数列法
private long mod = 998244353;
public long tree4 (long n) {
// 第一层的起点和终点都是1
long left = 1;
long right = 1;
long res = 0;
//每次i为每一层的深度,每次循环i+1,循环终点为到达最后一层
for(int i = 1; left <= n; i++){
//此处的目的是为了避免到最后一层时,因为要是没满的话,终点则为n
right = Math.min(right,n);
//等差数列的求和公式
res += (right-left+1)*(left+right)/2%mod * i%mod;
//下一层的起点
left = left*2;
//下一层的终点
right = right*2 + 1;
}
return res%mod;
} C、牛牛组数
题目分析:
因为要将字符串分为k个数,然后使得k个数加起来的结果最大。
假设有道题是将它分为n个数(n为字符串的长度),这样就是把它分没一个只有一个字符的数,要怎么样才能使得它最大呢?我想很简单的就能够想到就是, 我们把大的数放在高位,这样结果肯定是最大的。
所以我们回到这道题,题目是要分为k个数,这k个数是随机的,并不一定等于字符串的长度,所以我们可以组成一个极大数,保证极大数的字符都是最大的,然后加上k-1个只有一个字符的并且比较小的数,极大数中的字符就按照刚刚举的例子,大的放高位,这样组成的数字加起来不就最大了嘛!(可能有点绕口,但是多想几遍相信就能够想通)
public String Maxsumforknumers (String x, int k) {
//先转化为字符数组
char[] c = x.toCharArray();
//排序
Arrays.sort(c);
StringBuffer sb = new StringBuffer();
//保证第k个数是最大的(后面的k-1个数为较小的数)
//大的放高位,所有循环起点为数组的终点,然后依次循环到k-1
for(int i = x.length()-1; i >= k-1; i--){
//用sb拼接起来
sb.append(c[i]);
}
//将sb转化为整数
BigInteger bi = new BigInteger(sb.toString());
//后面的k-1个个位数
for(int i = 0; i < k-1; i++){
//全部数字相加
bi = bi.add(BigInteger.valueOf(c[i]-'0'));
}
//最后返回结果转化为字符串
return bi.toString();
} 
京公网安备 11010502036488号