0
点赞
收藏
分享

微信扫一扫

用Java刷算法题的常用数据结构(C++转Java)

Java旺 2022-05-02 阅读 113

文章目录


一:前言

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")

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();

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

举报

相关推荐

0 条评论