算法(三)、[海量] 数据处理java
1、数据处理算法
矩阵加法、乘法、转置、反序、对角线元素之和编程
查找矩阵、最小k个数、数组
2、海量数据处理ide
1、数据处理函数
一、矩阵加法测试
int[][] A = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; int[][] B = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; int[][] C = new int[3][3]; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { C[i][j] = A[i][j] + B[i][j]; } } for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { System.out.print(C[i][j] + "\t"); } System.out.println(); }
二、矩阵转置spa
int[][] A = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; int[][] D = new int[3][3]; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) D[i][j] = A[j][i]; } for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { System.out.print(D[i][j] + "\t"); } System.out.println(); }
三、矩阵相乘orm
public static int[][] matrix(int a[][], int b[][]) { // 当a的列数与矩阵b的行数不相等时,不能进行点乘,返回null if (a[0].length != b.length) return null; // c矩阵的行数y,与列数x int y = a.length; int x = b[0].length; int c[][] = new int[y][x]; for (int i = 0; i < y; i++) for (int j = 0; j < x; j++) // c矩阵的第i行第j列所对应的数值,等于a矩阵的第i行分别乘以b矩阵的第j列之和 for (int k = 0; k < b.length; k++) c[i][j] += a[i][k] * b[k][j]; return c; }
四、矩阵反序排序
输入:
1 | 2 | 3 |
4 | 5 | 6 |
7 | 8 | 9 |
输出:
9 | 8 | 7 |
6 | 5 | 4 |
3 | 2 | 1 |
至关于将a[2][2]和a[0][0]位置交换,a[2][1]和a[0][1]位置交换。能够发现对于前者2+0=2,2+0=2;对于后者2+0=2,1+1=2。
public static int[][] result(){ int[][] a={{1,2,3},{4,5,6},{7,8,9}}; int[][] b=new int[3][3]; for(int i=0;i<3;i++){ for(int j=0;j<3;j++){ b[2-i][2-j]=a[i][j]; } } return b; }
五、求n*n矩阵对角线元素之和。
int[][] t = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; int a = 0; for (int i = 0; i < t[1].length; i++) { a += t[i][i]; } System.out.println(a);
六、在一个二维数组中(每一个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
public static boolean YoungMatrix(int arr[][], int searchKey){ int COL=arr.length; int ROW=arr.length; int i = 0, j = COL - 1; int var = arr[i][j]; while (true){ if (var == searchKey) return true; else if (var < searchKey && i < ROW - 1) var = arr[++i][j]; else if (var > searchKey && j > 0) var = arr[i][--j]; else return false; } }
七、找出n个数里最小的k个
输入描述:
每一个测试输入包含空格分割的n+1个整数,最后一个整数为k值,n不超过100。
输出描述:
输出n个整数里最小的k个数。升序输出
示例1
输入
3 9 6 8 -10 7 -11 19 30 12 23 5
输出
-11 -10 3 6 7
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in=new Scanner(System.in); String[] string=in.nextLine().split(" "); int[] array=new int[string.length-1]; for(int i=0;i<string.length-1;i++){ array[i]=Integer.parseInt(string[i]); } Arrays.sort(array); for(int i=0;i<Integer.parseInt(string[string.length-1]);i++){ System.out.print(array[i]); if(i!=Integer.parseInt(string[string.length-1])-1){ System.out.print(" "); } } } }
八、将一个十进制数转化成二进制数
String temp = ""; int num = 198890; while (num != 0) { temp = num % 2 + temp; num = num / 2; } System.out.println(temp);
九、输入三个数字,若三个数字都相等则打印yes
public static void t(int a, int b, int c) { if (a == b && a == c) { System.out.println("yes"); } }
十、求N的阶乘N!
法一(非递归):
public static int b(int n){ int s=1; while(n>0){ s=s*n; n=n-1; } return s; } 法二(递归): public static int a(int n){ if(n==0||n==1){ return 1; } return n*a(n-1); }
十一、判断两个字符串是否为回环变位
public static void h(String a, String b) { if (a.length() == b.length()) { if (a.concat(b).indexOf(b) > 0 && b.concat(a).indexOf(a) > 0) { System.out.println("yes"); } else { System.out.println("no"); } } else { System.out.println("no"); } }
十二、求最大公约数
public static int getGCD(int a, int b) { int mod = a % b; while (mod != 0) { a = b; b = mod; mod = a % b; } return b; }
1三、最小公倍数
须要先求出最大公约数
public static int min(int m, int n) { return m * n / getGCD(m, n); }
1四、求两个正整数a和b的全部不大于n的公倍数
提示:求出最大公约数,而后利用(a*b)/最大公约数=最小公倍数,最后将最小公倍数依次增大一倍后与n比较大小,若是不大于n,则cunt进行+1操做。
1五、找到能除尽1至n的的每一个数字的最小整数m。如输入2 3 4 ,输出2 6 12
Scanner cin = new Scanner(System.in); BigInteger[] a = new BigInteger[105]; a[1] = BigInteger.ONE; for (int i = 2; i <= 100; i++)// 预处理 { a[i] = a[i - 1].multiply(BigInteger.valueOf(i)).divide(a[i - 1].gcd(BigInteger.valueOf(i))); } while (cin.hasNext()) { int n = cin.nextInt(); System.out.println(a[n].toString()); }
1六、斐波拉契数列
public static long fibonacci(long num) { if (num == 0 || num == 1) { return num; } else { return fibonacci(num - 1) + fibonacci(num - 2); } } public static void main(String[] args) { for (int counter = 0; counter <= 10; counter++) { System.out.printf("斐波那契数列 of %d is: %d\n", counter, fibonacci(counter)); } }
1七、输入三个数,按照从大到小输出
法一:
Scanner sc = new Scanner(System.in); int a = sc.nextInt(); int b = sc.nextInt(); int c = sc.nextInt(); int t; if (a < b) { t = a;a = b;b = t; } if (a < c) { t = a;a = c;c = t; } if (b < c) { t = b;b = c;c = t; } System.out.println(a + " " + b + " " + c);
法二:
int d = sc.nextInt(); int e = sc.nextInt(); int f = sc.nextInt(); int[] gg = new int[3]; gg[0] = d; gg[1] = e; gg[2] = f; Arrays.sort(gg); for (int i = gg.length - 1; i >= 0; i--) { System.out.println(gg[i]); }
1八、打印杨辉三角
打印出杨辉三角形(要求打印出10行以下图)
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
…………
1九、求1+2!+3!+...+20!的和
long sum = 0; long fac = 1; for (int i = 1; i <= 20; i++) { fac = fac * i; sum += fac; } System.out.println(sum);
20、有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
int x = 2, y = 1, t; double sum = 0; for (int i = 1; i <= 20; i++) { sum = sum + (double) x / y; t = y; y = x; x = y + t; } System.out.println("前20项相加之和是: " + sum);
2一、有一、二、三、4四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
int count = 0; for (int i = 1; i < 5; i++) { for (int j = 1; j < 5; j++) { for (int k = 1; k < 5; k++) { if (i != j && i != k && j != k) { count++; System.out.println(i * 100 + j * 10 + k); } } } } System.out.println(count + "个三位数");
2二、打印a * 1 + b * 2 + c * 3 =num的全部组合
public static void printNum(int sum){ for(int i=0;i<sum;i++){ for(int j=0;j<sum;j++){ for(int k=0;k<sum;k++){ if(i*1+j*2+k*3==sum){ System.out.println("i:"+i+" j:"+j+" k:"+j); } } } } }
2三、36块砖,36人搬,男搬4,女搬3,两个小儿抬一砖,要求一次性搬完,须要男、女、小儿各多少人?
for (int i = 0; i < 36; i++) { for (int j = 0; j < 36; j++) { for (int k = 0; k < 36; k++) { if (4 * i + 3 * j + k / 2 == 36 && i + j + k == 36 && k % 2 == 0) { System.out.println("man=" + i + ";women=" + j + ";child=" + k); } } } }
2四、打印九九乘法表
for (int i = 1; i <= 9; i++) { for (int j = 1; j <= i; j++) { System.out.print(i + "*" + j + "=" + i * j + " "); } System.out.println(); }
2五、一个数若是刚好等于它的因子之和,这个数就称为 "完数 "。例如6=1+2+3.编程找出1000之内的全部完数。
int N=100, m, s; System.out.println("小于" + N + "的完数有"); for (int i = 1; i <= N; i++) { s = 0; for (m = 1; m < i; m++) { if (i % m == 0) s += m; } if (s == i) { System.out.println(i); } }
2、海量数据处理
一、