算法(三)、[海量] 數據處理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、海量數據處理
一、