用Java刷算法题的常用数据结构

用Java刷算法题的常用数据结构,第1张


文章目录
  • 一:前言
    • 1:为何刷题从C++转java
    • 2:如何上手呢?
  • 二:输入
    • 1:常规的输入
    • 2:关于其他输入符在nextLine()之前用吃掉回车符的问题解决
    • 3:常见输入之我们输入一串数到容器中
  • 三:常用的数据结构
    • 1:数组
    • 2.List
    • 3:Map
    • 4:Set
    • 5.栈
    • 6:队列


一:前言 1:为何刷题从C++转java
  • 平时除了写项目的话,才用java,刷题的话就用C++,但是这样的话,对java的一些基本知识掌握不牢固,昨天jd的笔试当中
    就有考察一些基础知识
  • 虽然算法思路是最重要的,具体用什么语言实现主要 看自己对那门语言的数据结构用的溜即可 但是的话,实现是相同的
    以后毕竟还是要吃java这份饭的,对一些数据结构熟悉一些,对于写一个工具类,或者是阅读源码会更方便一些
  • 面试手撕算法题是可以用C++的,但是 从长远来看 用java刷题还是好处多多
2:如何上手呢?
  • 先了解常用的数据结构 无非就是数组 栈 队列 set list hashmap
  • 然后就是元素的插入,元素的遍历,一些常用API的调用,以及每个数据结构的特点
二:输入 1:常规的输入
		Scanner in = new Scanner(System.in);
        System.out.println("请输入你的年龄:");
        int age = in.nextInt();//整数类型的输入方式
        System.out.println("请输入你的身高:");
        double height = in.nextDouble();//小数类型的输入方式
2:关于其他输入符在nextLine()之前用吃掉回车符的问题解决

当比如我们在输入的是时候前面用了 nextInt();后面的话用了nextLine()的话,其会吃掉回车符,导致我们无法正常输入
那么我们的解决办法有两种

  • 将nextLine()改为next(),但是呢那么你就无法输入带空格的字符了
  • 将nextLine()的前面再加上nextLine(),这样就可以帮助我们吃掉回车符,那么我们正常的输入就不会有问题了。
  • 请看示例:
 Scanner in = new Scanner(System.in);
        System.out.println("请输入你的年龄:");
        int age = in.nextInt();//整数类型的输入方式
        System.out.println("请输入苹果的英文:");
        in.nextLine();//nextLine()会吃掉回车符,这样的话 我们下面就可以正常输入了
        String s1 = in.nextLine();//nextLine是可以输入带空格的数据的。
        System.out.println("请输入你的身高:");
        double height = in.nextDouble();//小数类型的输入方式
3:常见输入之我们输入一串数到容器中

这个是我们常用的之一,当题目给出一串数的话,我们往往是要将其存放在容器当中的,那么的话我们就可以方便 *** 作了

  		Scanner in = new Scanner(System.in);

        int[] arr = new int[10];

        for (int i = 0; i < 10; i++) {
            arr[i] = in.nextInt();
        }

        for (int i : arr) {
            System.out.print(i+ " ");
        }
三:常用的数据结构 1:数组
  • 定义
 int len = 5;
 int[] arr = new int[len];
  • 赋值
for (int i = 0; i < arr.length; i++) {
       Scanner scanner = new Scanner(System.in);
       arr[i] = scanner.nextInt();
 }
  • 遍历输出
for (int i = 0; i < arr.length; i++) {
     System.out.println(arr[i]);
}
  • 常用API之排序
  Arrays.sort(arr);
2.List
  • 定义
 		List<Integer> list = new ArrayList<>();
  • 赋值
		for (int i = 0; i < 5; i++) {
            int nums = in.nextInt();
            list.add(nums);
  		}
  • 遍历
    遍历输出 它的大小是 size() 区别数组的 length 区别字符串的 length()
 		for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+" ");
        }
  • API调用之sort升序
    注意o1.conpareTo(o2)
 	  list.sort(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1.compareTo(o2);//这里还可以用 o1 - o2 这个是等价的
            }
        });

conpareTo的源码:
其实就是3目运算符

	public static int compare(int x, int y) {
        return (x < y) ? -1 : ((x == y) ? 0 : 1);
    }
  • API调用之sort降序
    ** 注意o2.compareTo(o1)**
		list.sort(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2.compareTo(o1);//这里还可以用 o2 - o1 这个是等价的
            }
        });
  • API调用之按照对象的某个字段排序
    关于这个我们给出一个情景好记忆。
    比如我们要给一个班级数学成绩排序,数学成绩相同的话,那么我们就按照名字的字典序进行排序。
    输入:5
    wyj 100
    aaa 90
    abc 100
    bbb 70
    ccc 30
    输出: abc 100
    wyj 100
    aaa 90
    bbb 70
    ccc 30

public class textList {
    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);

        ArrayList<Student> list = new ArrayList<>();

        System.out.print("请输入学上的个数:");
        int studentNums = in.nextInt();

        for (int i = 0; i < studentNums; i++) {
            String sname = in.next();//nextLine()输入的是一行数据会包含空格 eg wyj 100
            int sgrade = in.nextInt();
            list.add(new Student(sname,sgrade));
        }

        list.sort(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                if (o1.getGrate() == o2.getGrate()) {
                    return o1.getName().compareTo(o2.getName());
                }
                return o2.getGrate()-(o1.getGrate());
            }
        });


        for (int i = 0; i < studentNums; i++) {
            System.out.println(list.get(i).toString());
        }


    }
}

class Student {
    private String name;
    private int grate;

    public Student(String name, int grate) {
        this.name = name;
        this.grate = grate;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getGrate() {
        return grate;
    }

    public void setGrate(int grate) {
        this.grate = grate;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", grate=" + grate +
                '}';
    }
}

3:Map
  • 定义
 Map<String,Integer> map = new HashMap<>();
  • 赋值
for (int i = 0; i < 3; i++) {
            String name  = in.next();
            int grade = in.nextInt();
            map.put(name,grade);
        }
  • 遍历
    map提供的get方法是根据key值来获取 value 值
   for (String s : map.keySet()) {
            System.out.println(s + " " + map.get(s));
   }
  • 常用API之判断某个值是否存在
map.containsKey("wyj")
  • 常用API之移除某个key
map.remove("wyj")
  • Entry
    由于Map中存放的元素均为键值对,故每一个键值对必然存在一个映射关系。
    Map中采用Entry内部类来表示一个映射项,映射项包含Key和Value (我们总说键值对键值对, 每一个键值对也就是一个Entry)
    Map.Entry里面包含getKey()和getValue()方法
Iterator<Map.Entry<Integer, Integer>> it=map.entrySet().iterator();
    while(it.hasNext()) {
        Map.Entry<Integer,Integer> entry=it.next();
        int key=entry.getKey();
        int value=entry.getValue();
        System.out.println(key+" "+value);
    }
  • entrySet
    entrySet是 java中 键-值 对的集合,Set里面的类型是Map.Entry,一般可以通过map.entrySet()得到。
    entrySet实现了Set接口,里面存放的是键值对。一个K对应一个V。
    用来遍历map的一种方法。
	Set<Map.Entry<String, String>> entryseSet=map.entrySet();
 
	for (Map.Entry<String, String> entry:entryseSet) {
 
    System.out.println(entry.getKey()+","+entry.getValue());
 
}
4:Set
  • 定义
     HashSet<Integer> set = new HashSet<>();
  • 赋值
 for (int i = 0; i < 3; i++) {
            int nums = in.nextInt();
            set.add(nums);
        }
  • 遍历
    这里的遍历的话 是可以去重的和升序的
  		for (int nums:set) {
            System.out.println(nums);
        }
  • 常用API之判断某个元素是否存在
set.contains(元素)
  • 常用API之移除某个key
set.remove(1)
  • 常用API之清空容器
    set.clear();
5.栈
//这是一个双端队列
ArrayDeque<Character> deque = new ArrayDeque<>();

//在栈中push就是往容器尾部插入一个值
deque.push('a');
deque.push('b');
deque.push('c');
deque.push('d');

//访问栈顶元素
System.out.println(deque.peek());

//删除一个元素
deque.pop();
System.out.println(deque.peek());
6:队列
//这是一个双端队列
ArrayDeque<Integer> deque = new ArrayDeque<>();

//用add的话表示就是取元素顺序时候就是先进先出
deque.add(1);
deque.add(2);
deque.add(3);

//我们用 peek()进行访问 访问的是队列首部元素
System.out.println(deque.peek());

//我们用 pool()表示的就是移除队列首部元素
deque.poll();
System.out.println(deque.peek());

//访问队尾元素
System.out.println(deque.getLast());

//移除队尾元素
deque.removeLast();
System.out.println(deque.getLast());

后序用到啥了再补充,这些都是平常用C++常用的API我就是在java当中找到对应的而已,一直不太想用java写算法题就是因为原来的C++的API调用熟悉了,但是打败恐惧的最好办法就是直面恐惧,我把以前不熟悉的总结出来,再用java写算法就不怵了 后续继续补充 有错请指出。。。。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/794607.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-06
下一篇2022-05-06

发表评论

登录后才能评论

评论列表(0条)

    保存