题一:顺时针打印二维数组
import java.util.Scanner;
public class LianXi {
public static void print(int[][] arr){
int leftUpRow = 0, leftUpCol = 0, rightDownRow = arr.length-1, rightDownCol = arr[0].length - 1;
while(leftUpRow <= rightDownRow && leftUpCol<= rightDownCol){
int r = leftUpRow ,c = leftUpCol;
while(c <= rightDownCol){
System.out.print(arr[r][c++] + " ");
}
c = rightDownCol;
r++;
while(r <= rightDownRow){
System.out.print(arr[r++][c] + " ");
}
r = rightDownRow;
c--;
while(c >= leftUpCol){
System.out.print(arr[r][c--] + " ");
}
c = leftUpRow;
r--;
while(r > leftUpRow){
System.out.print(arr[r--][c] + " ");
}
leftUpRow++;leftUpCol++;rightDownRow--;rightDownCol--;
}
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int M = in.nextInt();
int[][] arr = new int[N][M];
for(int i = 0; i<N; i++){
for(int j = 0; j<M; j++){
arr[i][j] = in.nextInt();
}
}
System.out.println("矩阵为:");
for(int i = 0; i<N; i++){
for(int j = 0; j<M; j++){
System.out.print(arr[i][j] + " ");
}
System.out.print("\n");
}
System.out.println("顺时针打印:");
print(arr);
}
}
题二:0所在的行列清零
import java.util.Scanner;
public class LianXi {
public static void print(int[][]arr){
int M = arr.length;
int N = arr[0].length;
//记录哪些行出现0
int[] rowRecord = new int[M];
//记录哪些列出现0
int[] colRecord = new int[N];
for(int i = 0; i<M; i++){
for(int j = 0; j<N; j++){
if(arr[i][j] == 0){
rowRecord[i] = 1;
colRecord[j] = 1;
}
}
}
for(int i = 0; i<M; i++){
for(int j = 0; j<N; j++){
if(rowRecord[i]==1 || colRecord[j]==1){
arr[i][j] = 0;
}
}
}
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int M = in.nextInt();
int N = in.nextInt();
int[][] arr = new int[M][N];
for(int i = 0; i<M; i++){
for(int j = 0; j<N; j++){
arr[i][j] = in.nextInt();
}
}
System.out.println("原始矩阵为:");
for(int i = 0; i<M; i++){
for(int j = 0; j<N; j++){
System.out.print(arr[i][j] + " ");
}
System.out.print("\n");
}
print(arr);
System.out.println("结果为:");
for(int i = 0; i<M; i++){
for(int j = 0; j<N; j++){
System.out.print(arr[i][j] + " ");
}
System.out.print("\n");
}
}
}
题三:Z形打印
import java.util.Scanner;
public class LianXi {
public static void print(int[][]arr){
int r = 0, m = arr.length;
int c = 0, n = arr[0].length;
boolean l2r = true; //从左到右
while(r<m && c<n){
//从左下到右上的斜线
if(l2r){
System.out.print(arr[r][c] + " ");
//现在在第一行,列未到边界,这时只能向右移
if(r==0 && c<n-1){
l2r = !l2r; //方向切换
c++;
continue;
}else if(r>0 && c==n-1){
//现在在最后一列,只能向下走
l2r = !l2r;
r++;
continue;
}else{
//继续走山坡
r--;
c++;
}
}
else{
//反,走下坡
System.out.print(arr[r][c] + " ");
if(r<m-1 && c==0){
//走到第一列,只能往下走
l2r = !l2r;
r++;
continue;
}else if(r == m-1){
l2r = !l2r;
c++;
continue;
}
else{
r++;
c--;
}
}
}
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int M = in.nextInt();
int N = in.nextInt();
int[][] arr = new int[M][N];
for(int i = 0; i<M; i++){
for(int j = 0; j<N; j++){
arr[i][j] = in.nextInt();
}
}
System.out.println("原始矩阵为:");
for(int i = 0; i<M; i++){
for(int j = 0; j<N; j++){
System.out.print(arr[i][j] + " ");
}
System.out.print("\n");
}
System.out.println("结果为:");
print(arr);
}
}
题四:找出边界为1的最大子方阵
public class LianXi {
public static int print(int[][] arr){
int N = arr.length;
int n = N;
while(n>0){
for(int i = 0; i<N; i++){
if(i + n > N) break;
l3:
for(int j = 0; j<N; j++){
if(j+n > N) break;
//检查四个边
int r = i;
int c = j;
//上
while(c < j+n){
if(arr[r][c++] == 0)
continue l3;
}
c--;
//右
while(r < i+n){
if(arr[r++][c] == 0)
continue l3;
}
r--;
//下
while(c >= j){
if(arr[r][c--] == 0) continue l3;
}
c++;
//左
while(r >= i){
if(arr[r--][c] == 0) continue l3;
}
r++;
return n;
}
}
n--;
}
return 0;
}
public static void main(String[] args){
int[][] arr = {
{
0,1,1,1,1},
{
0,1,0,0,1},
{
0,1,0,0,1},
{
0,1,1,1,1},
{
0,1,0,1,1}};
int res = print(arr);
System.out.print(res);
}
}
题五:子数组最大累加和
暴力解法:
import java.util.Scanner;
public class LianXi {
public static void getMaxSum(int[] arr){
int maxSum = arr[0];
for(int j = 0; j<arr.length;j++){
int maxj = arr[j];
for(int i = j+1; i<arr.length; i++){
maxj += arr[i];
if(maxj>maxSum){
maxSum = maxj;
}
}
}
System.out.println(maxSum);
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int[] arr = new int[N];
for(int i = 0; i<N;i++){
arr[i] = in.nextInt();
}
getMaxSum(arr);
}
}
递推法:
import java.util.Scanner;
public class LianXi {
public static void getMaxSum(int[] arr){
int sumj = arr[0];
int maxSum = sumj;
for(int j = 1; j<arr.length; j++){
if(sumj > 0){
sumj += arr[j];
}
else{
sumj = arr[j];
}
if(sumj > maxSum){
maxSum = sumj;
}
}
System.out.println(maxSum);
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int[] arr = new int[N];
for(int i = 0; i<N;i++){
arr[i] = in.nextInt();
}
getMaxSum(arr);
}
}
题六:求子矩阵最大累加和
import java.util.Arrays;
import java.util.Scanner;
public class LianXi {
public static int maxSum(int[][] matrix){
int beginRow = 0;
final int M = matrix.length;
final int N = matrix[0].length;
int[] sums = new int[N]; //按列求和
int max = 0;
while(beginRow<M){
//起始行
for(int i = beginRow; i<M; i++){
//从起始行到第i行
//按列累加
for(int j = 0; j<N; j++){
sums[j] += matrix[i][j];
}
//累加完成
int t = getMaxSum(sums);
if(t>max){
max = t;
}
//另起一行作为起始行,把sums清零
Arrays.fill(sums, 0); //快速地将sum的每个元素都设定为0
beginRow++;
}
}
return max;
}
public static int getMaxSum(int[] arr){
int sumj = arr[0];
int maxSum = sumj;
for(int j = 1; j<arr.length; j++){
if(sumj > 0){
sumj += arr[j];
}
else{
sumj = arr[j];
}
if(sumj > maxSum){
maxSum = sumj;
}
}
return maxSum;
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int M = in.nextInt();
int N = in.nextInt();
int[][] arr = new int[M][N];
for(int i = 0; i<M; i++){
for(int j = 0; j<N; j++){
arr[i][j] = in.nextInt();
}
}
int res = maxSum(arr);
System.out.println(res);
}
}
矩阵运算
import java.util.Arrays;
import java.util.Scanner;
public class LianXi {
public static void getX(int[][]A, int[][]B, int M, int N){
int [][] X = new int[M][N];
for(int i = 0; i<M; i++){
for(int j = 0; j<N; j++){
X[i][j] = (B[i][j] - A[i][j]) / 2;
}
}
for(int i = 0; i<M; i++){
for(int j = 0; j<N; j++){
System.out.print(X[i][j] + " ");
}
System.out.print("\n");
}
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int M = in.nextInt();
int N = in.nextInt();
int[][] A = new int[M][N];
int[][] B = new int[M][N];
for(int i = 0; i<M; i++){
for(int j = 0; j<N; j++){
A[i][j] = in.nextInt();
}
}
System.out.println("A矩阵为:");
for(int i = 0; i<M; i++){
for(int j = 0; j<N; j++){
System.out.print(A[i][j] + " ");
}
System.out.print("\n");
}
for(int i = 0; i<M; i++){
for(int j = 0; j<N; j++){
B[i][j] = in.nextInt();
}
}
System.out.println("B矩阵为:");
for(int i = 0; i<M; i++){
for(int j = 0; j<N; j++){
System.out.print(B[i][j] + " ");
}
System.out.print("\n");
}
System.out.println("X矩阵为:");
getX(A,B,M,N);
}
}
矩阵乘法
import java.util.Arrays;
import java.util.Scanner;
public class LianXi {
public static void getX(int[][]A, int[][]B, int M, int N, int k){
int [][] X = new int[M][k];
for(int i = 0; i<M; i++){
for(int j = 0; j<k; j++){
for(int o = 0; o<N; o++)
X[i][j] += A[i][o] * B[o][j];
}
}
for(int i = 0; i<M; i++){
for(int j = 0; j<k; j++){
System.out.print(X[i][j] + " ");
}
System.out.print("\n");
}
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int M = in.nextInt();
int N = in.nextInt();
int K = in.nextInt();
int[][] A = new int[M][N];
int[][] B = new int[N][K];
for(int i = 0; i<M; i++){
for(int j = 0; j<N; j++){
A[i][j] = in.nextInt();
}
}
System.out.println("A矩阵为:");
for(int i = 0; i<M; i++){
for(int j = 0; j<N; j++){
System.out.print(A[i][j] + " ");
}
System.out.print("\n");
}
for(int i = 0; i<N; i++){
for(int j = 0; j<K; j++){
B[i][j] = in.nextInt();
}
}
System.out.println("B矩阵为:");
for(int i = 0; i<N; i++){
for(int j = 0; j<K; j++){
System.out.print(B[i][j] + " ");
}
System.out.print("\n");
}
System.out.println("X矩阵为:");
getX(A,B,M,N,K);
}
}