二维数组中的查找
public class Solution {
public static void main(String[] args) {
System.out.println(new Solution().Find(2, new int[][]{{1, 1}}));
}
public boolean Find(int target, int [][] array) {
if(array == null || array.length == 0 || array[0].length == 0) {
return false;
}
int rows = array.length, cols = array[0].length;
int r = 0, c = cols - 1;
while(r <= rows - 1 && c >= 0) {
if(target == array[r][c]) {
return true;
} else if(target > array[r][c]) {
r++;
} else {
c--;
}
}
return false;
}
}
数组中重复的数字
public class Solution {
/**
* 3. 数组中重复的数字
* 要求时间复杂度 O(N),空间复杂度 O(1)。因此不能使用排序的方法,也不能使用额外的标记数组。
*
* 对于这种数组元素在 [0, n-1] 范围内的问题,可以将值为 i 的元素调整到第 i 个位置上进行求解。在调整过程中,
* 如果第 i 位置上已经有一个值为 i 的元素,就可以知道 i 值重复。
*
* 以 (2, 3, 1, 0, 2, 5) 为例,遍历到位置 4 时,该位置上的数为 2,但是第 2 个位置上已经有一个 2 的值了,
* 因此可以知道 2 重复
*
* @param args
*/
public static void main(String[] args) {
System.out.println(new Solution().duplicate(new int[]{2, 3, 1, 0, 2, 5}));
}
public int duplicate(int[] nums) {
for (int i = 0; i < nums.length; i++) {
while (nums[i] != i) {
if (nums[i] == nums[nums[i]]) {
return nums[i];
}
swap(nums, i, nums[i]);
// 1 3 2 0 2 5
// 3 1 2 0 2 5
}
swap(nums, i, nums[i]);
// 0 1 2 3 2 5
}
return -1;
}
private void swap(int[] nums, int i, int j) {
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
}
替换空格
public class Solution {
public static void main(String[] args) {
System.out.println(new Solution().replaceSpace("1 2 3 3"));
}
/**
* 替换空格
*
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param s string字符串
* @return string字符串
*/
public String replaceSpace(String s) {
StringBuffer result = new StringBuffer(s);
int p1 = result.length() - 1;
for (int i = 0; i <= p1; i++) {
if (result.charAt(i) == ' ')
//这里是两个空格哈
result.append(" ");
}
int p2 = result.length() - 1;
while (p1 >= 0 && p2 > p1) {
char c = result.charAt(p1--);
if (c == ' ') {
result.setCharAt(p2--, '0');
result.setCharAt(p2--, '2');
result.setCharAt(p2--, '%');
} else {
result.setCharAt(p2--, c);
}
}
return result.toString();
}
}
第一个只出现一次的字符位置
/**
* 在一个长为 字符串中找到第一个只出现一次的字符,并返回它的位置,
* 如果没有则返回 -1(需要区分大小写).(从0开始计数)
*
* @author inke219223m
*/
public class Solution {
public static void main(String[] args) {
System.out.println(new Solution().firstUniqChar(""));
System.out.println(new Solution().firstUniqChar("cc"));
}
public int FirstNotRepeatingChar1(String str) {
int[] cnts = new int[128];
for (int i = 0; i < str.length(); i++)
cnts[str.charAt(i)]++;
for (int i = 0; i < str.length(); i++)
//条件 cnts[str.charAt(i)] == 1
if (cnts[str.charAt(i)] == 1) return i;
return -1;
}
public char FirstNotRepeatingChar(String s) {
int[] cnts = new int[128];
for (int i = 0; i < s.length(); i++)
cnts[s.charAt(i)]++;
for (int i = 0; i < s.length(); i++)
//条件 cnts[str.charAt(i)] == 1
if (cnts[s.charAt(i)] == 1) return s.charAt(i);
return ' ';
}
public char firstUniqChar(String s) {
if (s.equals("")) return ' ';
int[] cnts = new int[128];
for (int i = 0; i < s.length(); i++) {
cnts[s.charAt(i)]++;
}
for (int i = 0; i < s.length(); i++) {
if (cnts[s.charAt(i)] == 1)
return s.charAt(i);
}
return ' ';
}
}
顺时针打印矩阵
public class Solution {
public static void main(String[] args) {
System.out.println(new Solution().printMatrix(new int[][]{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}));
System.out.println(new Solution().spiralOrder(new int[][]{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}));
}
public ArrayList<Integer> printMatrix(int[][] matrix) {
ArrayList<Integer> ret = new ArrayList<>();
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++) {
//第一行 [r1][i]
ret.add(matrix[r1][i]);
}
//右
for (int i = r1 + 1; i <= r2; i++) {
ret.add(matrix[i][c2]);
}
if (r1 != r2) {
//下
for (int i = c2 - 1; i >= c1; i--) {
ret.add(matrix[r2][i]);
}
}
if (c1 != c2) {
//左
for (int i = r2 - 1; i > r1; i--) {
ret.add(matrix[i][r1]);
}
}
r1++;
r2--;
c1++;
c2--;
}
return ret;
}
public int[] spiralOrder(int[][] matrix) {
ArrayList<Integer> ret = new ArrayList<>();
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++) {
//第一行 [r1][i]
ret.add(matrix[r1][i]);
}
//右
for (int i = r1 + 1; i <= r2; i++) {
ret.add(matrix[i][c2]);
}
if (r1 != r2) {
//下
for (int i = c2 - 1; i >= c1; i--) {
ret.add(matrix[r2][i]);
}
}
if (c1 != c2) {
//左
for (int i = r2 - 1; i > r1; i--) {
ret.add(matrix[i][r1]);
}
}
r1++;
r2--;
c1++;
c2--;
}
return ret.stream().mapToInt(Integer::valueOf).toArray();
}
}
done