继续前天的脚步,昨天家里有事,今天上午才回来,刚开始就中断一天,总感觉心里毛毛的,这不会预示什么吧(怕怕。。。)
前天晚上在网上询问了一下关于算法和数据结构的如何学习的问题,得到的回答大相径庭。没办法,果然学习还是自己摸索前进比较带劲,刺激!!!
我看了网上好多人都是在力扣上面刷题,我做了几道简单的(抱歉,3道就会1道,我对不起我的算法老师),感觉做题不会知识点还是没用。 我打算根据我自己目前会的,结合力扣的简单题,先从数据结构入手。
首先是数组,这个在java中也是经常用到的,是一个连续性的线性存储结构,元素个数是固定的,类型是相同的。
想到数组就会想起HashMap,读取速度快,但是修改删除慢
查阅资料,总结数组的缺点:
1.使用前要知道数组的长度
2.插入元素很慢
3.空间固定
4.插入删除效率低
这里,首先要知道数组插入元素的原理,也就是数组扩容,学习过java的我对于这点还算了解
数组的扩容
思路:
先定义一个更大的数组,然后将原数组元素复制到新数组中,让原数组名指向新的数组
具体的代码实现(纯手打!!!)
public class Test{
public static void main(String[] args){
//手动扩容
test01();
//自动扩容
test02();
}
private static void test01(){
int[] data1 = {1,2,3,4,5};
//定义一个更大的数组
int[] newData = new int[data1.length + 1];
//复制元素,添加到新数组中
for(int i =0;i < data1.length;i++){
newData[i] = data1[i];
}
//让原来的数组名指向新的数组,更换引用地址?
data1 = newData;
//遍历数组
for(int x:data2){
System.out.println();
}
}
private static void test02(){
int[] data2 = {1,2,3,4,5};
//利用Arrays工具类的copyOf方法
//Arrays.copyOf(原数组,新数组长度),不用创建新的数组,直接在原数组上扩容
data2 = Arrays.copyOf(data2,data2.length+1);
//遍历数组
for(int x:data2){
System.out.println();
}
}
}
虽然数组的插入效率低,但相对的,它的读取效率就不错。
网上查看的资料说,可以用数组实现一个简单的哈希表?下标作为key,元素作为value值(哎呦,很优秀欧)。有了这样的键值对的组合,查找元素相对就轻松不小
到这里,我们来尝试解决今天的算法题目
如何找到第一个只出现一次的字符
思路:
首先遍历字符串的每个字符,记录下他们的出现次数,字符是key,次数作为value值
第二次遍历HashMap,第一次遍历到值为1的,就结束,输出该字符
public class ABC{
public static void main(String[] args){
//给一个字符串
String s = "abcde";
//使用toCharArray方法将字符串的值赋值给数组
char[] ch = s.toCharArray();
//创建Map集合
Map<Character,Integer> map = new HashMap<>();
//将字符与次数赋值给map集合
for(int i = 0;i < ch.length;i++){
//用字符串中的字符作为map集合中的键,创建一个num变量来统计该键出现的次数,即该键的value值
//集合中不要使用基本数据类型,用对应的包装类型
Integer num = map.get(ch[i]);
//判断,该字符是否存在集合中
if(num == null){//值为空,因为是包装类,所以显示的是null,而不是0;
//如果为空,说明集合中没有该字符,添加该字符为key,并添加value值1
map.put(ch[i],1);
}else{
//不是第一次出现,就将该键的value值加1
map.put(ch[i],num + 1);
}
}
//第二次遍历map集合,获得第一个只出现一次的字符
for(Character k : map.keySet()){
if(map.get(k) == 1){
System.out.println(k);
break;
}
}
}
}
手敲太累了,就当熟悉代码了,明天继续。 每天打算用一个小时来做算法题,发现好像不够。。。。