美文网首页
从C++过渡到Java做算法题

从C++过渡到Java做算法题

作者: 来到了没有知识的荒原 | 来源:发表于2020-09-30 16:45 被阅读0次

输入

  • 重定向输入

  • 以及如何读入数据

FileInputStream fis=new FileInputStream("data.txt");
System.setIn(fis);

Scanner reader=new Scanner(System.in);
int N=reader.nextInt();
int M=reader.nextInt();
String str=reader.next();
System.out.println(N);
System.out.println(str);

字符串

判断是否是回文

public boolean isPalindrome(int x) {
    String reversedStr = (new StringBuilder(x + "")).reverse().toString();
    return (x + "").equals(reversedStr);
}

反转字符串

StringBuilder有reverse()
String无reverse()

如何修改一个字符

String不能修改一个字符,只能使用StringBuildersetCharAt

StringBuilder sb=new StringBuilder("Asdf");
sb.setCharAt(0,'Z');
System.out.println(sb.toString());

Map

常用:

Map<Integer,Integer>map=new HashMap<>();
map.put(0,1);
map.containsKey(0);
map.containsValue(1);
map.get(0);
map.getOrDefault(1,3);

Sort

注意是左闭右开

Integer[] a = { 9, 8, 7, 2, 3, 4, 1, 0, 6, 5 };    // 数组类型为Integer
Arrays.sort(a,1,4);  
for (int arr : a) {
    System.out.print(arr + " ");
}

自定义排序1 (toArray,这样可以定义排序范围)

Arrays.sort接受的第一个参数一定要是一个数组,不能是一个List类

Comparator<Integer> cmp2 = new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o2 - o1;
    }
};
List<Integer> l2 = Arrays.asList(new Integer[]{4, 1, 2, 3});
Integer[] arr2 = new Integer[l2.size()];
Arrays.sort(l2.toArray(arr2), 0, l2.size()-1, cmp2);  //转换成Integer[]

for (int i : arr2) {
    System.out.print(i + " ");
}

自定义排序2 (List,不能确定范围,只能整个List排序)

class Stu {
    public int id, score;

    public Stu(int id, int score) {
        this.id = id;
        this.score = score;
    }

    @Override
    public String toString() {
        return "Stu{" +
            "id=" + id +
            ", score=" + score +
            '}';
    }
}

Comparator<Stu> cmp = new Comparator<Stu>() {
    @Override
    public int compare(Stu o1, Stu o2) {
        if (o1.score != o2.score) return o2.score - o1.score;
        return o1.id - o2.id;
    }
};

List<Stu> lst = new ArrayList<>();
lst.add(new Stu(2, 98));
lst.add(new Stu(3, 99));
lst.add(new Stu(1, 99));

lst.sort(cmp);
for(Stu s:lst){
    System.out.println(s);
}
System.out.println(cmp.compare(lst.get(0),lst.get(1)));

数组转换

// 注意必须是Integer[],如果是int[]就必须手动转化为List,(there is no shortcut)
Integer[] a = { 9, 8, 7, 2, 3, 4, 1, 0, 6, 5 };
List <Integer>lst=Arrays.asList(a);
for(int i:lst){
    System.out.print(i+" ");
}
System.out.println();
Collections.reverse(lst);
for(int i:lst){
    System.out.print(i+" ");
}

队列 queue

107. 二叉树的层次遍历 II

queue必须用new LinkedList

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();

        Queue<TreeNode> q = new LinkedList<>();
        if (root != null) q.offer(root);
        while (!q.isEmpty()) {
            int n = q.size();
            List<Integer> tmp = new ArrayList<>();
            for (int i = 0; i < n; i++) {
                TreeNode t = q.peek();
                q.poll();
                if (t.left != null) q.offer(t.left);
                if (t.right != null) q.offer(t.right);
                tmp.add(t.val);
            }
            res.add(0, tmp);
        }
        return res;
    }
}

stack

1 boolean empty() 测试堆栈是否为空。
2 Object peek( ) 查看堆栈顶部的对象,但不从堆栈中移除它。
3 Object pop( ) 移除堆栈顶部的对象,并作为此函数的值返回该对象。
4 Object push(Object element) 把项压入堆栈顶部。
5 int search(Object element) 返回对象在堆栈中的位置,以 1 为基数。
Stack<Integer> st = new Stack<Integer>();

List

List<Integer>lst=new ArrayList<>();

添加add;
删除remove;
设置set(index,val);
获取get(index);

相关文章

网友评论

      本文标题:从C++过渡到Java做算法题

      本文链接:https://www.haomeiwen.com/subject/ojxpuktx.html