剑指offer刷题06/22

1.数组中重复的数字
在这里插入图片描述
思路:
在这里插入图片描述
模拟过程
考虑这样一组数
数组元素:1 2 3 3 0
数组序号:0 1 2 3 4
第一次模拟之后:2 1 3 3 0 //即这里1被交换到了数组【1】的位置
第二次: 3 1 2 3 0//这里2被交换到了[2]的位置
第三次:3 1 2 3 0//这里3被交换到了[3]的位置
第四次:0 1 2 3 3//这里0被交换到了[0]的位置
最后一次发现当前这个位置的num[i]==num[num[i]]//即num[4]==num[num[4]]==num[3]
根据这个思路,我们很容易可以得到如下代码:

import java.util.*;
public class Solution {
    //交换函数
    private void swap(int[] numbers, int a, int b){
        int temp = numbers[a];
        numbers[a] = numbers[b];
        numbers[b] = temp;
    }
    public int duplicate (int[] numbers) {
        for(int i = 0; i < numbers.length; i++){
            //该位置本来就是对的
            if(numbers[i] == i)
                continue;
            //位置不对,需要换到自己对应的位置
            else{
                //对应位置相等,重复
                if(numbers[i] == numbers[numbers[i]])
                    return numbers[i];
                //交换位置
                else
                    swap(numbers, i, numbers[i]);
            }
        }
        //没有重复
        return -1;
    }
}

在这里插入图片描述

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return string字符串
     */
    public String replaceSpace(String s) {
		StringBuilder stringBuilder=new StringBuilder();
		for(int i=0;i<s.length();i++) {
			if(s.charAt(i)==' ')
				stringBuilder.append("%20");
			else 
				stringBuilder.append(s.charAt(i));
		}
		return stringBuilder.toString();
	}

}

这里简单介绍一下StringBuilder的使用方法


public class StrBuilder {

	public static void main(String[] args) {
		//新生成一个StringBuilder对象
		StringBuilder stringBuilder=new StringBuilder("abcdefghi");
		//以字符串形式输出
		System.out.println(stringBuilder .toString());
		//追加数据放在字符串后面append方法
		stringBuilder.append("537");
		
		System.out.println(stringBuilder .toString());
		
		//向指定位置插入数据
		stringBuilder.insert(2, "yuhao");
		
		System.out.println(stringBuilder .toString());
		
		//删除指定位置的数据
		stringBuilder.delete(3, 5);
		
		System.out.println(stringBuilder .toString());
		
		//将对象中的数据反转
		stringBuilder.reverse();
		
		System.out.println(stringBuilder .toString());
		
		
	}
}

另外我在面试的时候也被问到过关于String、StringBuffer与StringBuilder之间区别的问题,这里贴个图和链接

在这里插入图片描述

三者之间的区别

在这里插入图片描述
思路
在这里插入图片描述
代码

import java.util.*;
public class Solution {
    public int FirstNotRepeatingChar(String str) {
        HashMap<Character, Integer> mp = new HashMap<>();
        //统计每个字符出现的次数
        for(int i = 0; i < str.length(); i++) 
            mp.put(str.charAt(i), mp.getOrDefault(str.charAt(i), 0) + 1);
        //找到第一个只出现一次的字母
        for(int i = 0; i < str.length(); i++) 
            if(mp.get(str.charAt(i)) == 1)
                return i;
        //没有找到
        return -1; 
    }
}


这里我认为要注意的一点是Java中getOrdefault()方法`

    Map<Integer,Integer> map = new HashMap<>();
    map.put(1,11);
    
    // 存在Key1,返回11
    System.out.println(map.getOrDefault(1,22));
    // 不存在Key3,返回默认值33
    System.out.println(map.getOrDefault(3,33));

	//输出
	11
	33

看到这里,我们就可以理解这里default是默认的意思,也就是说在它未被赋值的情况下去使用它后面给安排的值,对于上述题目中解析就是对于尚且未被赋值的赋0,也就是第一次出现的赋0.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值