这是我第一次写周赛的题目,并且仍是虚拟的。从此次起,之后就将全部错过的题目都写到博客来。固然既然是我错的,那代码确定不是我本身的。我会注明来源。而且我会本身敲一遍。多总结老是没坏处的。java
另外比较糟糕的是我错过了PAT的报名时间(截止到8/30 12:00),因此暂时我就不刷PAT的题目,专一于LeetCode的题目。web
下面进入正题数组
这题真滴不难,可是我当时想的很是复杂,我觉得不会这么简单的就那么两个条件判断。。。谁曾想,真滴就是这样。。。ide
参考:uwi 这位大神的。svg
思路:spa
true
。List<String> ans
中。代码以下:code
class Solution { public List<String> invalidTransactions(String[] transactions) { int length = transactions.length; // 交易个数 boolean[] invalid = new boolean[length]; // 可能无效 String[] name = new String[length]; // 交易名 int[] time = new int[length]; // 时间 int[] amount = new int[length]; // 金额 String[] city = new String[length]; // 城市 // 输入全部交易信息 for (int i = 0; i < length; ++i) { String str = transactions[i]; String[] arr = str.split(","); name[i] = arr[0]; time[i] = Integer.parseInt(arr[1]); amount[i] = Integer.parseInt(arr[2]); city[i] = arr[3]; } // 检查每笔交易是否有效 for (int i = 0; i < length; ++i) { if (amount[i] > 1000) { // 金额超过1000 invalid[i] = true; // 无效 } // 检查后面的交易是否与第i笔交易冲突 for (int j = i + 1; j < length; ++j) { if (name[i].equals(name[j]) && // 交易名相同 !city[i].equals(city[j]) && // 城市不一样 Math.abs(time[i] - time[j]) <= 60) {// 时间差不超过60 invalid[i] = invalid[j] = true; // 这两笔交易都无效 } } } // 将无效的交易添加到列表 List<String> ans = new ArrayList<String>(); for (int i = 0; i < length; ++i) { if (invalid[i]) { ans.add(transactions[i]); } } return ans; } }
大神 megaspazz 的原代码,我啥都没改(写的太好了,我不知道怎么改),他是拿的满分,可是我提交三次全超时,不试了,代码确定是正确的。xml
第一次碰到 TreeSet
,看起来挺费劲的。全部地方都有注释。我不敢保证此次我都理解了。可是下次至少熟悉一些。这位博主写的还不错 Java集合类(四)—TreeSet - 简书。排序
class DinnerPlates { TreeSet<Integer> pushable = new TreeSet<>();// 保存非满栈下标 TreeSet<Plate> plates = new TreeSet<>();// 保存盘子 int[] heights = new int[100001];// 每一个栈的栈顶 int cap;// 栈的最大容量 public DinnerPlates(int capacity) {// 构造方法 for (int i = 0; i <= 100000; ++i) {// 最多100001个栈 pushable.add(i);// 非满栈按照序号依次排好 } cap = capacity; } // 将给出的正整数val推入从左往右第一个没有满的栈。 public void push(int val) { int whichStack = pushable.first();// 获取第一个非空栈下标。 // 建立一个盘子,参数分别是“所在的栈的下标”,“栈顶的下标”,“值”。 Plate p = new Plate(whichStack, heights[whichStack], val); plates.add(p);// 将盘子添加到栈顶 ++heights[whichStack];// 栈顶上移 if (heights[whichStack] == cap) {// 当前栈满 // 去掉满栈的下标,这样之后取第一个的时候始终获得一个非空栈 pushable.remove(whichStack); } } // 返回从右往左第一个非空栈顶部的值,并将其从栈中删除;若是全部的栈都是空的,返回-1。 public int pop() { // 返回从右往左第一个非空栈顶部的值,并将其从栈中删除 Plate p = plates.pollLast(); if (p == null) {// 若是是null,那么就说明全部的栈都是空的 return -1;// 返回-1 } remove(p);// 将盘子从栈中删除 return p.value;// 返回取出的盘子所保存的值 } // 返回编号index的栈顶部的值,并将其从栈中删除;若是编号index的栈是空的,返回-1。 public int popAtStack(int index) { // 获取新建立的盘子的左边的非空的盘子,若是没有,返回null Plate p = plates.lower(new Plate(index + 1, 0, 0)); // 若是为null,或者取出的不是咱们要找的编号为index的栈中的盘子 if (p == null || p.index != index) { return -1;// 说明编号index的栈是空的,返回-1 } remove(p);// 若是找到了,将它从栈中删除 return p.value;// 返回盘子的值 } // 将盘子p从栈中删除 private void remove(Plate p) { plates.remove(p); --heights[p.index];// 栈顶向下移一位 pushable.add(p.index);// 当前栈已经不是满栈 } // 盘子,实现排序的Comparable接口 private static class Plate implements Comparable<Plate> { public int index;// 所在的栈的下标 public int height;// 在栈中的下标 public int value;// 值 public Plate(int i, int h, int v) { index = i; height = h; value = v; } @Override public int compareTo(Plate p) { // 保证每一个栈是从左往右排好的 int di = Integer.compare(index, p.index);// 下标升序排序 if (di != 0) { return di; } // 高度升序排序,保证栈顶元素始终在右边 return Integer.compare(height, p.height); } } }