顺时针打印矩阵
题目链接
牛客网(opens new window)
题目描述
按顺时针的方向,从外到里打印矩阵的值。下图的矩阵打印结果为:1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10
解题思路
采用一圈一圈的打印,因此需要确定圈的边界(即4个点的坐标),不断缩小边界,需要注意的是在向左和向上时需要判断是不是只剩该行(表示为r1=r2)或只剩该列(表示为c1=c2),否则会重复打印
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| public ArrayList<Integer> printMatrix(int[][] matrix) { ArrayList<Integer> res = new ArrayList<>(); int rows = matrix.length; int cols = matrix[0].length; if (cols <= 0) return null; int r1 = 0, r2 = matrix.length - 1, c1 = 0, c2 = matrix[0].length - 1; while (r1<=r2 && c1<=c2) { for (int i = c1; i <= c2; i++) { res.add(matrix[r1][i]); } for (int i = r1 + 1; i <= r2; i++) { res.add(matrix[i][c2]); } if (r1 != r2) for (int i = c2 - 1; i >= c1; i--) { res.add(matrix[r2][i]); } if (c1 != c2) for (int i = r2 - 1; i > r1; i--) { res.add(matrix[i][c1]); } r1++; r2--; c1++;c2--; }
return res; }
|
第一个只出现一次的字符位置
题目链接
牛客网(opens new window)
题目描述
在一个字符串中找到第一个只出现一次的字符,并返回它的位置。字符串只包含 ASCII 码字符。
解题思路
一开始想的是用Map进行存储统计次数,但是要先判断是否存在key再进行加法,会略复杂。
也可以直接使用一个128大小的int数组,因为输入的字符在ASCII码范围内,根据字符串输入顺序对数组进行统计和筛选即可
1 2 3 4 5 6 7 8 9 10
| public int FirstNotRepeatingChar(String str) { int[] res = new int[128]; for (int i =0 ; i<str.length(); i++) { res[str.charAt(i)]++; } for (int i = 0; i<str.length(); i++) { if (res[str.charAt(i)] == 1) return i; } return -1; }
|