每日刷题——leetcode 剑指offer 3、4、5、29、50

本文介绍了Java编程中涉及的基础数组和矩阵问题的解决方案,包括寻找重复数字、二维数组查找、字符串空格替换和顺时针打印矩阵。通过实例解析了四种算法的实现,并探讨了字符串操作和数组遍历的技巧。此外,还解决了一个查找字符串中唯一字符的问题,展示了如何利用哈希表优化查找效率。
摘要由CSDN通过智能技术生成

开始准备找工作,目标java开发,从0开始学习java,每日更新刷题的心得。
今天主要是几道基础的数组与矩阵。

剑指offer3 数组中重复的数字

在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。

这一题思路很简单,只需要构造一个hash表,表示每个数字重复的次数,即可,时间复杂度O(n),空间复杂度O(n)。
这里题目中有一个细节,数组里的所有数字都在0到n-1范围内,那么可以使用原地置换,直接使用原数组作为hash表

class Solution {
    public int findRepeatNumber(int[] nums) {
    	int len = nums.length;
    	for(int i=0; i<len; i++){
    		while(nums[i]!=i){
    			if(nums[nums[i]]!=nums[i]) {
					int temp = nums[i];
					nums[i] = nums[temp];
					nums[temp] = temp;
				}else{
    				return nums[i];
				}
			}
		}
    	return -1;
    }
}

剑指offer4 二维数组中的查找

给定一个二维数组,其每一行从左到右递增排序,从上到下也是递增排序。
给定一个数,判断这个数是否在该二维数组中。

该数组,向右递增, 向下也是递增,就很难搞,当target大于当前数时,不知道向右还是向下。这时候,需要换个方向,使一边增大,一边减小,这样就可以轻松得到结果。所以选择右上角或左下角,右上角为例,向左减小,向右增大,只需要根据和target的大小比较,来确定移动方向。

class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
    	int lenx = matrix.length;
    	if(lenx==0){
    		return false;
		}
    	int leny = matrix[0].length;
    	if(leny==0) return false;
    	int i = 0, j = leny-1;
    	while(i<lenx&&j>=0){
    		if(matrix[i][j]>target){
    			j--;
			}else if(matrix[i][j]<target){
    			i++;
			}else{
    			return true;
			}
		}
    	return false;
    }
}

剑指offer5 替换空格

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

就是一道基础的string类型操作题,作为java小白,这可难倒我了。
JAVA中,string类型是不可操作的,所以需要重新构造string。
总结题解,主要包括两种方法,一类是通过构造charArray,使用String类方法来构造string,另一类是通过StringBuilder方法,来构造string

class Solution {
    public String replaceSpace(String s) {
    	StringBuilder res = new StringBuilder();
    	for(Character c: s.toCharArray()){
    		if(c==' ') res.append("%20");
    		else res.append(c);
		}
    	return res.toString();
    }
}

剑指offer29 顺时针打印矩阵

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字

这一题没啥难度,设定上下左右界,设定循环即可。需要注意的就是,当上下界相同,左右界相同时,只需要单向打印就结束了。

class Solution {
    public int[] spiralOrder(int[][] matrix) {
    	if(matrix==null || matrix.length==0 || matrix[0].length==0){
    		return new int[0];
		}
    	int rows = matrix.length, columns = matrix[0].length;
    	boolean[][] visited = new boolean[rows][columns];
    	int total = rows * columns;
    	int[] order = new int[total];
    	int row = 0, column = 0;
    	int[][] directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
    	int direction = 0;
    	for(int i=0; i<total; i++){
    		order[i] = matrix[row][column];
    		visited[row][column] = true;
    		int nextRow = row + directions[direction][0], nextColumn = column + directions[direction][1];
    		if (nextRow<0 || nextRow>=rows || nextColumn<0 || nextColumn>=columns || visited[nextRow][nextColumn]==true){
    			direction = (direction + 1) % 4;
			}
    		row += directions[direction][0];
    		column += directions[direction][1];
		}
    	return order;
    }
}

剑指offer50 第一个只出现一次的字符

在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。

这一题和剑指offer第三题很像,都是构造一个hash表,当然这里是string类型,需要考虑string类型的读写。

class Solution {
    public char firstUniqChar(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++){
    		if(cnts[s.charAt(i)]==1){
    			return s.charAt(i);
			}
		}
    	return ' ';
    }
}

今天,就到了这里了。因为是第一天,比较简单,四道easy,一道mid。主要是熟悉下java的语法,string类型操作还是比较多,需要认真学习。最后,希望自己能坚持下来更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值