1.求一个矩阵乘法和矩阵乘方
/**
* 矩阵乘法
* @param A x*y的矩阵
* @param B y*z的矩阵
* @return C x*z的矩阵
*/
public static int[][] multi(int A[][], int B[][]) {
// A的行数
int x = A.length;
// A的列数 = B的行数
int y = B.length;
// B的列数
int z = B[0].length;
// 需要返回的数组
int C[][] = new int[x][z];
for (int i = 0; i < x; i++) {
for (int j = 0; j < z; j++) {
for (int k = 0; k < y; k++) {
C[i][j] += A[i][k] * B[k][j];
}
}
}
return C;
}
/**
* 矩阵乘方
* @param A 需要进行乘方的x*x矩阵
* @param n 需要进行乘方的次数
* @return C 结果矩阵
*/
public static int[][] pow(int A[][], int n) {
int x = A.length;
int[][] C = A;
// n次方只需要乘以n-1次
for (int i = 0; i < n - 1; i++) {
C = multi(C, A);
}
return C;
}
2.进制转换函数,将一个数转换为2-16进制的数
/**
* 进制抓换
* @param n 需要转换的数字
* @param r r代表转换为r进制,可以是2-16之间的数字
* @return 返回被转化进制之后的字符串
*/
public static String convert(int n,int r){
StringBuilder sb = new StringBuilder();
int remainder = n%r;
//取余
while(n !=0 ){
switch(remainder){
case 10:
sb.append('A');
break;
case 11:
sb.append('B');
break;
case 12:
sb.append('C');
break;
case 13:
sb.append('D');
break;
case 14:
sb.append('E');
break;
case 15:
sb.append('F');
break;
default:
sb.append(String.valueOf(remainder));
}
n = n/r;
remainder = n%r;
}
//余数倒序
return sb.reverse().toString();
}
3.求完全二叉树的公共祖先
/**
* 求完全二叉树的公共祖先,二叉树根结点下标为1
* @param a 第一个节点的下标
* @param b 第二个节点的下标
* @return 返回公共祖先的下标
*/
public int getLCA(int a, int b) {
while (a != b) {
if (a > b)
//a变成a的父结点
a = a / 2;
else
//b变成b的父结点
b = b / 2;
}
return a;
}
4.求一维数组的最大连续子序列的和和二维矩阵最大子矩阵的和
/**
* 求一位数组的最大连续子序列的和
* @param array 传递进去的一位数组
* @param n 数组的长度
* @return 返回连续最大连续子序列的和
*/
public int maxSubArray(int[] array,int n){
int sum = 0;
int max = Integer.MIN_VALUE;
for(int i = 0;i<n;i++){
sum+=array[i];
if(sum<0)
sum=0;
if(sum>max)
max = sum;
}
return max;
}
/**
* 求矩阵的最大子矩阵的和
* 思路是将二维的矩阵化为一维的数组,求一维数组的最大连续子序列的和
* @param mat 二维矩阵n*n
* @param n 矩阵的阶数
* @return 返回最大子矩阵的和
*/
public int sumOfSubMatrix(int[][] mat, int n) {
int[] temp = new int[n];
//初始化
for(int i = 0;i<n;i++)
temp[i] = 0;
int max = Integer.MIN_VALUE;
//从第一行开始往下加...从第二行开始往下加......从第n行开始往下加
for(int i = 0;i<n;i++){
//temp只加了一行
temp = mat[i];
max = (maxSubArray(temp,n)>max)?maxSubArray(temp,n):max;
//temp开始往下加第二行,第三行...
for(int j = i+1;j<n;j++){
for(int k = 0;k<n;k++){
temp[k] +=mat[j][k];
}
//每加完一行之后,比较一下最大值
max = (maxSubArray(temp,n)>max)?maxSubArray(temp,n):max;
}
}
return max;
}