最长和为零的子数组与最大子矩阵
2015-09-26 22:53
501 查看
昨天晚上参加某笔试,竟然一个都没做出来来,好不心甘啊,折腾了半天,又是百度又是谷歌终于解决了,也学习到了好多知识,知道自己的不足。
其实这两道题男的不是算法,难的是输入格式转换。第一题需要将输入的一行空格隔开的数据转换成数组,第二题难得是将输入的一行空格,分号隔开的数转换成矩阵。
题一是求一个长度为N的数组中最长的子数组
最长和为零的子数组
Java代码如下:
第二题是求最大子矩阵,难点在于从输入的一行数转换为矩阵。
Java代码如下:
其实这两道题男的不是算法,难的是输入格式转换。第一题需要将输入的一行空格隔开的数据转换成数组,第二题难得是将输入的一行空格,分号隔开的数转换成矩阵。
题一是求一个长度为N的数组中最长的子数组
最长和为零的子数组
Java代码如下:
import java.util.*; public class Main { // 最长和为零的子数组 // 求输入数组的最长和为零的子数组 // 1 2 3 4 -1 -2 -4 -3 1 2 /* * Author: T.J. Shi * Time: 9/26/2015 */ public static void main(String[] args) throws IOException {public static void main(String[] args) throws IOException { Scanner scanner= new Scanner(System.in); String string = scanner.nextLine(); List<Integer> values = new ArrayList<Integer>(); String[] vStrs = string.split(" "); for(String str : vStrs) { values.add(Integer.valueOf(str)); } int[] array = new int[values.size()]; int i = 0; for(Integer v : values) { array[i++] = v; } int sum = 0; int start = 0, stop = array.length - 1; outer: for (int l = array.length; l >= 1; l--) { for (int j = 0; j <= array.length - l; j++) { for (int k = j; k < j + l; k++) { sum += array[k]; } start = j; stop = j + l - 1; if (sum == 0) { for (int s = start; s <= stop; s++) { System.out.print(array[s] + " "); } break outer; // System.out.println(""); // if (start == array.length - l) { // break outer; // } // continue; } sum = 0; } } }
第二题是求最大子矩阵,难点在于从输入的一行数转换为矩阵。
Java代码如下:
import java.util.*; public class Main { // 最大子矩阵 // 求输入矩阵中元素和最大的2 x 2矩阵的和 // 1 2 0 3 4;2 3 4 5 1;1 1 5 3 0 /* * Author: T.J. Shi * Time: 9/26/2015 */ public static void main(String[] args) { Scanner scanner= new Scanner(System.in); String string = scanner.nextLine(); List<Integer> values = new ArrayList<Integer>(); String[] matrixRow = string.split(";"); String[] matrixColumn = matrixRow[0].split(" "); int[][] matrix = new int[matrixRow.length][matrixColumn.length]; for (int i = 0; i < matrixRow.length; i++) { for (int j = 0; j < matrixColumn.length; j++) { matrix[i][j] = Integer.valueOf(matrixRow[i].split(" ")[j]); } } for (int i = 0; i < matrixRow.length; i++) { for (int j = 0; j < matrixColumn.length; j++) { System.out.print(matrix[i][j] + " "); } System.out.println(); } int sum = 0, temp; int ii = 0, jj = 0; for (int i = 0; i < matrixRow.length - 1; i++) { for (int j = 0; j < matrixColumn.length - 1; j++) { temp = matrix[i][j] + matrix[i][j + 1] + matrix[i + 1][j] + matrix[i + 1][j + 1]; if (temp > sum) { ii = i; jj = j; sum = temp; } } } System.out.println(ii + " " + jj); System.out.println(sum); } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android之获取手机上的图片和视频缩略图thumbnails
- android string.xml文件中的整型和string型代替
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- [Android]在代码里运行另一个程序的方法
- 插入排序