2022.4.20剑指05, 58-2, 03, 53-2

学习剑指offer 第三天

05 替换空格

  • 题目描述
    请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
  • 解析
    -先计算出空格的个数,就可以计算出替换后字符串的长度,再从后向前遍历
    public String replaceSpace(String s) {
        char[] str = s.toCharArray();
        //先计算出空格,就可以计算出替换后的长度
        int count = 0;
        for(char i : str){
            if(i == ' '){
                count++;
            }
        }
        int new_length = str.length + 2 * count;
        char[] new_str = new char[new_length];
        //从后向前遍历
        int index = new_length - 1;
        for(int i = str.length - 1; i >= 0; i--){
            if(str[i] == ' '){
                new_str[index--] = '0';
                new_str[index--] = '2';
                new_str[index--] = '%';
            }else{
                new_str[index--] = str[i];
            }
        }

        return new String(new_str);
    }

58-2⃣️ 左旋转字符串

  • 题目描述
    字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
  • 解析
 public String reverseLeftWords(String s, int n) {
        char[] new_str = new char[s.length()];
        int index = 0;
        for(int i = n; i < n + s.length(); i++){
            new_str[index++] = s.charAt(i % s.length());
        }
        return new String(new_str);
    }

03 数组中重复的数字

  • 题目描述:
    在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
  • 解析:
public int findRepeatNumber(int[] nums) {
        int[] record = new int[nums.length];
        for(int i = 0; i < nums.length; i++){
            if(record[nums[i]] > 0) return nums[i];
            else record[nums[i]]++;
        }
        return -1;
    }

53-1 在排序数字中查找数字1

  • 题目描述:
    统计一个数字在排序数组中出现的次数
  • 解析
    先用二分法查找到该数字,在向左向右遍历数组
 public int search(int[] nums, int target) {
        if(nums.length == 0 || target < nums[0] || target > nums[nums.length - 1]) return 0;
        //二分法找到该数字,之后左右遍历
        int left = 0, right = nums.length;
        int middle = 0;
        //二分法:左闭右开
        while(left < right){
            middle = left + (right - left) / 2;
            if(target == nums[middle]) break; 
            else if(target > nums[middle]) left = middle + 1;
            else right = middle;
        }
        int count = 0;
        int temp = middle;
        //包括middle
        while(temp >= 0 && nums[temp--] == target){
            count++;
        }
        //不包括middle
        while( ++middle < nums.length && nums[middle] == target){
            count++;
        }
        return count;
    }

53-2 0-n-1中缺失的数字

  • 题目描述
    一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
  • 解析
	public int missingNumber(int[] nums) {
        for(int i = 0; i < nums.length; i++){
            if(nums[i] != i) return i;
        }
        //注意前面顺序连着,此时缺少的就是最后一个数字
        return nums.length;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值