这是一道Java算法测试题,只是题目有点长,但看着图片和例子,耐心多读一下就能很容易明白,同学都说题目不难,但本人实在是小白,特此求助,能编写运行出结果立即采纳给分,拜托了。
现有大小为N行的正方形地图,编号从1到N,每行包含N个单元格,每列标有连续的英文大写字母(A,B,C等)。每个单元格通过行编号及列编号组成的串来标识:例如,“9C” 表示第9行中的第三单元,“15D”表示第15行中的第四单元。
如下图所示,现有几个最大面积不超过4个单元格组成的矩形,X表示被标记的单元格。
目标是计算 被X标记且标记满的矩形的数量 和 被X标记但未被标记满的矩形数量。(请看例子)
例如,下图显示了一个大小为N = 4的地图,两个蓝色矩形(一个正方形,一个长方形)和五个用字母“x”标记的单元格;
在这个例子中,长方形的三个单元格已经被标记满,正方形只有一个单元格被标记,但未被标记满。在下一张图片中,标记满的矩形被显示为灰色,未标记满的矩形显示为红色:
用字符串S表示矩形的位置,其分别包含描述矩形的左上角和右下角单元格的位置对。矩形之间用逗号分隔。如上图,S =“1B 2C,2D 4D”。字符串T表示被标记的单元格的位置,包含描述被击中的地图单元的位置:如图,T =“2B 2D 3D 4D 4A”。 S中的矩形和T中的被标记单元格可以以任何顺序出现。
写一个函数:
class Solution {public String solution(int N,String S,String T); }
设地图的大小为N,字符串S描述矩形位置,T描述被标记的单元格,要求返回具有两个数字的字符串:被标记满的矩形的数量和被标记但未被标记满的矩形数量,用逗号分隔。
例如,假设N = 4,S =“1B 2C,2D 4D”和T =“2B 2D 3D 4D 4A”,您的函数应返回“1,1”,如上所述。
class Solution {
/*
*N 表示地图大小
*S 表示船只的大小
*T 表示被命中的位置
* N = 4,S =“1B 2C,2D 4D”和T =“2B 2D 3D 4D 4A”
* */
public static String solution(int N,String S,String T) throws Exception{
int hitShipLostCount = 0;
int hitShipRunCount = 0;
//获取没亮船只
if(S != null && S != ""){
String[] ships = S.split(",");
//遍历船只,获取船只的每个位置
for (String ship : ships) {
//获取船只最小位置
String shipMin = ship.substring(0,ship.indexOf(" "));
int xMin = Integer.valueOf(shipMin.charAt(0) + "");
char yMin = shipMin.charAt(1);
//获取船只最大位置
String shipMax = ship.substring(ship.indexOf(" ") + 1);
int xMax = Integer.valueOf(shipMax.charAt(0) + "");
char yMax = shipMax.charAt(1);
if(xMax <= N){
//定义集合保存船只的位置
List<String> shipPieces = new ArrayList<String>();
for (int i = xMin; i <= xMax; i++) {
for (int j = yMin; j <= yMax; j++) {
String s = (char)j + "";
shipPieces.add(i + s);
}
}
//获取被炮弹命中的位置,并去掉重复的
Set<String> shells = new HashSet<String>();
String[] shellsArr = T.split(" ");
for (String shell : shellsArr) {
shells.add(shell);
}
//用于记录船只被击中的碎片数
int count = 0;
for (String shipPiece : shipPieces) {
for (String shell : shells) {
if(shipPiece.equals(shell)){
count ++ ;
}
}
}
//被击中沉没船只的数量
if(count == shipPieces.size()){
hitShipLostCount ++ ;
}
//击中未沉没船只的数量
if(count > 0 && count < shipPieces.size()){
hitShipRunCount ++ ;
}
}else{
throw new Exception("船只还没有完全进入地图");
}
}
}
return hitShipLostCount + "," + hitShipRunCount;
};
public static void main(String[] args) {
try {
String answer = solution(4,"1B 2C,2D 4D","2B 2D 3D 4D 4A");
System.out.println(answer);
} catch (Exception e) {
e.printStackTrace();
}
}
}
这主要是很麻烦,需要各种字符拆分和计算,除非很闲才会帮你做,我建议还是自己做吧,不懂就问。
public String solution(int N, String S, String T){
int x = 0; //命中的数量
int d = 0; //击落的数量
String[] boatArray = S.split("\\,");
String[] hitPosArray = T.split("\\ ");
ArrayList<String> hitPosList = new ArrayList<String>();
for(int i=0;i<hitPosArray.length;i++){
hitPosList.add(hitPosArray[i]);
}
for(int i = 0; i < boatArray.length; i++){
String[] boatPos = boatArray[i].split("\\ ");
if(boatPos.length != 2){
return "boat " + i + " position error";
}
String leftTop = boatPos[0];
String rightBottom = boatPos[1];
if(leftTop.length() != 2) return "boat " + i + "leftTop error";
if(rightBottom.length() != 2) return "boat " + i + "rightBottom error";
char left = leftTop.charAt(0);
char top = leftTop.charAt(1);
char right = rightBottom.charAt(0);
char bottom = rightBottom.charAt(1);
ArrayList<String> tmp = new ArrayList<String>();
for(int j=left;j<=right;j++){
for(int k=top;k<=bottom;k++){
tmp.add((char)j + "" + (char)k);
}
}
int num =0;
for(int j=0;j<tmp.size();j++){
if(!hitPosList.contains(tmp.get(j))){
num++;
}
}
if(num == 0){
d++;
}else{
x++;
}
}
return d+","+x;
}
到底采纳谁的了呀,晕死了!