都还蛮简单的=-=但是我的写法可能比较笨蛋一点希望谅解。
题目一:停车场监控问题
题目描述:某长方形停车场,每个车位上方都有对应监控器,当且仅当在当前车位或者前后左右四个方向任意一个车位范围停车时监控器打开,给出某一时刻停车场的停车分布,统计最少需要打开多少个监控器。输入描述为:第一行输入m,n表示长款.后面输入m行,每行有n个0或1,0和1用空格隔开,表示该行停车情况,0表示空位,1表示已停车。
解题思路就是用两个二维数组,一个表示停车场状态一个表示摄像头,第一个遍历一边,如果遇到1就把另一个二维数组对应位置的上下左右都变成1,然后数第二个数组有多少个1就好了,代码如下:(比较笨蛋的解法)
import java.util.Scanner;
public class parkingLot {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int m = in.nextInt();
int n = in.nextInt();
int[][] parkingStatus = new int[m][n];
int[][] monitorStatus = new int[m][n];
for(int i = 0;i < m;i++){
for(int j=0;j<n;j++){
parkingStatus[i][j] = in.nextInt();
monitorStatus[i][j] = 0;
}
}
for(int i = 0;i<m;i++){
for(int j = 0;j<n;j++){
if(parkingStatus[i][j] == 1){
monitorStatus[i][j] = 1;
//左侧添加摄像头
if(j>0){
monitorStatus[i][j-1] =1;
}
//右侧
if(j<n-1){
monitorStatus[i][j+1] =1;
}
if(i<m-1){
monitorStatus[i+1][j] =1;
}
if(i>0){
monitorStatus[i-1][j] =1;
}
}
}
}
int count=0;
for(int i = 0;i<m;i++){
for(int j=0;j<n;j++){
if(monitorStatus[i][j]==1){
count++;
}
}
}
System.out.println(count);
}
}
题目二:完成一种排列,输入n,表示n行数字,第一行1个第二行2个,第n行n个,奇数行正序排列,偶数行逆序,数字从1开始,规则是每个数字占据4个位置,不足四位用*补位,数字之间要相邻4个空格,最后一行数字顶个,n-1行相对第n行缩进四个空格
说实话刚看到题目想了半天没搞明白啥意思=-= 实际上就是输入多少就打印多少行,比如n=3,输出是这样的
主要是要注意打印的格式,有严格要求
思路就是还是二维数组,每一层按照规则把数字装载进去,然后按照规则打印就行,代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
String[][] arrangement = new String[n][];
int num =1;
for(int i=0;i<n;i++) {
int count = i + 1;
String[] row = new String[count];
for (int j = 0; j < count; j++) {
String filNumber = filterNumber(num);
row[j] = filNumber;
num++;
}
arrangement[i] = (i % 2 == 0) ? row : reverseArray(row);
}
for (int i=0;i<n;i++){
String indent = repeatString(" ",n-1-i);
String[] row = arrangement[i];
System.out.print(indent);
for(String number : row){
System.out.print(number+" ");}
System.out.println();
}
}
//补位
private static String filterNumber(int number){
String filNumber = String.format("%-4d",number);
return filNumber.replace(" ","*");
}
//逆序
private static String[] reverseArray(String[] arr){
int len = arr.length;
String[] reverseArr = new String[len];
for(int i = 0;i< len;i++){
reverseArr[i] = arr[len - 1 - i];
}
return reverseArr;
}
private static String repeatString(String str,int times){
StringBuilder sb = new StringBuilder();
for(int i=0;i<times;i++){
sb.append(str);
}
return sb.toString();
}
}
注意输出的规则就好了
题目三:输入一个单词前缀和一个字典,输出包含该前缀的单词。输入描述:单词前缀,字典长度,字典。字典是一个有序单词数组。输出所有包含该前缀的单词,多个单词换行输出,如果没有返回-1。
比如输入 pre 3 prea bbb ccc返回就是prea
这个就很简单,java String有个startsWith很好用,所以说用个List就解决了,代码如下:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String pre = in.next();
int dicLen = in.nextInt();
String[] dictionary = new String[dicLen];
for (int i =0;i<dicLen;i++){
dictionary[i] = in.next();
}
List<String> result = find(pre,dicLen,dictionary);
if(result.isEmpty()){
System.out.println(-1);
}else {
for(String word : result){
System.out.println(word);
}
}
}
private static List<String> find (String pre,int dicLen,String[] dictionary){
List<String> result = new ArrayList<>();
for(int i =0;i<dicLen;i++){
String word = dictionary[i];
if(word.startsWith(pre)){
result.add(word);
}
}
return result;
}
}
总体来说还是很简单的,主要是想清楚就好了。