牛客连续最大和,统计回文,不要二
发布日期:2021-05-14 17:05:59 浏览次数:18 分类:精选文章

本文共 2886 字,大约阅读时间需要 9 分钟。

题目一:连续最大和

一个数组有 N 个元素,求连续子数组的最大和。例如:[-1,2,1],和最大的连续子数组为[2,1],其和为 3。解决这个问题的关键在于找到数组中最长的连续正数子数组的和。

首先,我们可以通过遍历数组的每个元素,维护一个当前和当前的最大值。具体来说,我们从数组的第一个元素开始,逐步累加当前元素的值到当前和中。如果当前和大于等于最大值,我们就更新最大值。这种方法的时间复杂度为 O(N),非常高效。

import java.util.*;
public class Main {
public static int getMax(int[] arr) {
int max = arr[0];
int current = arr[0];
for (int i = 1; i < arr.length; i++) {
current += arr[i];
if (current > max) {
max = current;
}
}
return max;
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = scan.nextInt();
}
System.out.println(getMax(arr));
}
}

题目二:统计回文

“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。花花非常喜欢这种拥有对称美的回文串,生日的时候她得到两个礼物分别是字符串A和字符串B。现在她非常好奇有没有办法将字符串B插入字符串A使产生的字符串是一个回文串。你接受花花的请求,帮助她寻找有多少种插入办法可以使新串是一个回文串。如果字符串B插入的位置不同就考虑为不一样的办法。

要解决这个问题,我们可以逐一尝试将字符串B插入字符串A的所有可能位置,然后检查每个新形成的字符串是否是回文。具体来说,我们可以遍历字符串A的每个位置(包括前后),将字符串B插入到当前位置,形成一个新的字符串。然后用新字符串的反转版本与原字符串比较,如果相等,则说明这是一个回文。

import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String str1 = scan.nextLine();
String str2 = scan.nextLine();
int count = 0;
for (int i = 0; i <= str1.length(); i++) {
StringBuffer sb = new StringBuffer(str1);
sb.insert(i, str2);
String temp = sb.toString();
if (new StringBuffer(temp).reverse().toString().equals(temp)) {
count++;
}
}
System.out.println(count);
}
}

题目三:不要二

有一个W×H的网格盒子,网格的行编号为0到H-1,列编号为0到W-1。每个格子至多可放一块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为√[(x1-x2)^2 + (y1-y2)^2],最多可以放多少块蛋糕在网格盒子里。

这个问题需要通过数学分析来解决。首先,我们需要找出网格中互不冲突的蛋糕放置方式。由于两块蛋糕的欧几里得距离不能等于2,这意味着它们的坐标差的平方和不能等于4。因此,任何两个放置的蛋糕不能满足(x1-x2)^2 + (y1-y2)^2 = 4。

通过分析,我们可以发现最优的放置方式是每隔一个格子放置一块蛋糕。具体来说,我们可以按照棋盘格的方式放置蛋糕,使得任何两块蛋糕之间的距离都大于2。这种方法可以最大化蛋糕的数量。

import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int w = scan.nextInt();
int h = scan.nextInt();
int[][] grid = new int[w][h];
// 初始化棋盘格
for (int i = 0; i < w; i++) {
for (int j = 0; j < h; j++) {
if ((i + j) % 2 == 0) {
grid[i][j] = 1;
} else {
grid[i][j] = 0;
}
}
}
int count = 0;
// 遍历每个格子
for (int i = 0; i < w; i++) {
for (int j = 0; j < h; j++) {
if (grid[i][j] == 1) {
count++;
}
}
}
System.out.println(count);
}
}
上一篇:另类加法,走方格的方案数,最近公共祖先
下一篇:字符串转整数, Fibonacci数列,合法括号序列判断

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2025年04月20日 17时27分39秒