zoukankan      html  css  js  c++  java
  • LeetCode第151场周赛(Java)

    这是我第一次写周赛的题目,而且还是虚拟的。从这次起,以后就将所有错过的题目都写到博客来。当然既然是我错的,那代码肯定不是我自己的。我会注明来源。并且我会自己敲一遍。多总结总是没坏处的。

    另外比较糟糕的是我错过了PAT的报名时间(截止到8/30 12:00),所以暂时我就不刷PAT的题目,专注于LeetCode的题目。

    下面进入正题


    1169. 查询无效交易

    这题真滴不难,但是我当时想的非常复杂,我以为不会这么简单的就那么两个条件判断。。。谁曾想,真滴就是这样。。。

    参考:uwi 这位大神的。

    思路:

    • 直接输入所有交易,将信息保存到四个数组中。
    • 用一个标志数组保存交易是否无效,无效则为 true
    • 两层循环检查交易是否冲突。
    • 将无效的交易信息添加到 List<String> ans 中。

    代码如下:

    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;
        }
    }
    

    1172. 餐盘栈

    大神 megaspazz 的原代码,我啥都没改(写的太好了,我不知道怎么改),他是拿的满分,但是我提交三次全超时,不试了,代码肯定是正确的。

    第一次碰到 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);
    		}
    	}
    }
    
  • 相关阅读:
    laravel获取不到session
    laravel表单提交419错误
    'cross-env' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
    centos 虚拟机出问题 Oh no,something has gone wrong! 解决方法
    fastadmin关闭验证码登录
    php二维数组排序
    不自动显示html表单记住的内容 自动完成等清除记忆
    两个服务器之间使用minio同步文件
    redis获取数据库个数
    html跳转页面
  • 原文地址:https://www.cnblogs.com/wowpH/p/11687400.html
Copyright © 2011-2022 走看看