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.