weekly-contest-205

1 / 5507. 替换所有的问号

class Solution {
public String modifyString(String s) {
StringBuilder res = new StringBuilder();
for(int i=0; i<s.length(); i++){
if(s.charAt(i)!='?'){
res.append(s.charAt(i));
}else{
boolean head = (i==0);
boolean tail = (i==s.length()-1); for(int j=0;j<26;j++){
char ap = (char)('a'+j); // 不为头部
if(!head){
// 注意此处不能使用 s.charAt(i-1),如果i-1是?则此处判断会错误
// 应该使用替换后的StringBuilder作为判断对象
if(res.charAt(i-1) == ap)
continue;
}
// 不为尾部,且后一个字符不为?(为?则没有判断的必要,当前选任意字符必然不会和?重复)
if(!tail && s.charAt(i+1)!='?'){
if(s.charAt(i+1)==ap)
continue;
}
res.append(ap);
break;
}
}
}
return res.toString();
}
}

总结:

  • 对于边界条件的判断不够灵敏,当i==0时为head,此时不应该向前判断;当i==s.length()时为tail,此时不应该向后判断;当s.charAt(i+1)!='?'时,没有向后判断的必要(此条件可以省略)
  • 变量的状态没判断清楚,将原字符串一直作为比较对象,向前判断的时候仍然使用s.charAt(i-1),这个值原先为?,但是替换并不是在s上进行替换,所以此处的判断就会导致错误。

2 / 5508. 数的平方等于两数乘积的方法数

class Solution {
// j!=k
// map(key,value) (key:j*k,value:times)
// i^2 == key result+=value
public int numTriplets(int[] nums1, int[] nums2) {
return countTri(nums1,nums2) + countTri(nums2,nums1);
} public int countTri(int[] nums1, int[] nums2){
Map<Long,Long> map = calMap(nums2);
int result=0;
for(int i=0;i< nums1.length; i++){
if(map.containsKey((long)nums1[i]*nums1[i])){
result+=map.get((long)nums1[i]*nums1[i]);
}
}
return result;
} public Map<Long,Long> calMap(int[] nums){
Map<Long,Long> map = new HashMap<>();
for(int i=0;i< nums.length-1; i++){
for(int j=i+1; j<nums.length; j++){ if(!map.containsKey((long)nums[i]*nums[j])){
map.put((long)nums[i]*nums[j],(long)1);
//map.put((long)nums[i]*nums[j],1l);
}else{
map.put((long)nums[i]*nums[j],map.get((long)nums[i]*nums[j])+1);
}
}
}
return map;
}
}
// 1 <= nums1.length, nums2.length <= 1000
// 1 <= nums1[i], nums2[i] <= 10^5

总结:

  • 数据的大小为10^5,两个数据相乘最大可达100亿,超过了int类型的上限,所以此处要将int类型转换成long

    • long的封装类型为Long
    • 在转换时如果使用(long)(nums[i]*nums[j])是不正确的, 程序会先计算括号内的数据,但是括号是两个int相乘,得到的结果也是int,此时数据已经溢出,再转换为long时无法将溢出的数据补回,(long)nums[i]*nums[j]则是先将前面的int类型强转为long,long与int类型操作,数据向上转型,此时计算结果就正确
  • (long)2333 == 2333l

3 / 5509. 避免重复字母的最小删除成本

class Solution {
//多个字符相同
public int minCost(String s, int[] cost) {
int sampP = 0;
int result=0;
for(int i=0; i<s.length()-1; i++){
while(sampP<s.length()-1 && s.charAt(sampP+1) == s.charAt(i)){
sampP++;
}
result += calCost(i,sampP,cost);
i = sampP;
}
return result;
}
public int calCost(int start, int end, int[] cost){
int result=0;
int max=-1;
for(int i=start; i<=end; i++){
result+=cost[i];
max = Math.max(max,cost[i]);
}
result -=max;
return result;
}
}

总结:

  • 此题无踩坑,需要注意到多个字符相同时留下一个字符即可,留下删除代价最高的那个字符即可。另就是需要小心sampP的边界值判断。

* 4 / 5510. 保证图可完全遍历

class Solution {
private boolean[] used;
public int maxNumEdgesToRemove(int n, int[][] edges) {
used = new boolean[edges.length];
// System.out.println(Arrays.deepToString(edges));
// 根据第一个元素倒序排序
Arrays.sort(edges, (a, b) -> Integer.compare(b[0], a[0]));
if(unionFind(n, edges, 1) != 1) return -1;
if(unionFind(n, edges, 2) != 1) return -1;
int result = 0;
for(boolean u: used){
result += u ? 0 : 1;
}
return result;
} private int unionFind(int n, int[][] edges, int excludedType){
int[] union = new int[n + 1];
for(int i = 1; i <= n ; i++){
union[i] = i;
}
for(int i = 0; i < edges.length; i++){
int[] edge = edges[i];
if(edge[0] == excludedType) continue;
int rootA = findRoot(union, edge[1]);
int rootB = findRoot(union, edge[2]); //rootA!=rootB则两个点尚未连通,将其连通
if(rootA != rootB){
union[rootA] = rootB;
used[i] = true;
}
}
int result = 0;
for(int i = 1; i <= n; i++){
if(union[i] == i) result += 1;
}
return result;
} private int findRoot(int[] union, int idx){
if(union[idx] != idx){
int root = findRoot(union, union[idx]);
union[idx] = root; // 压缩路径,否则有两个case会超时
return root;
}
return idx;
}
}

总结:

  • 并查集的关键在于find(),union数组储存了当前节点的父元素,两个节点的根元素(最顶上的父元素,union[idx]==idx)相同则代表两个元素相同,find即寻找出了节点的根元素。
  • 如果数组只储存了节点的父元素,则每次需要寻找根元素时都需要往上查找非常多次,所以这里需要进行路径压缩,让union中直接储存当前节点的根元素,这样在后续查找的时候可以直接查询到。
  • 本题根元素特征union[i] == i,即当前节点的根元素是自己。

weekly-contest-205的更多相关文章

  1. LeetCode Weekly Contest 8

    LeetCode Weekly Contest 8 415. Add Strings User Accepted: 765 User Tried: 822 Total Accepted: 789 To ...

  2. Leetcode Weekly Contest 86

    Weekly Contest 86 A:840. 矩阵中的幻方 3 x 3 的幻方是一个填充有从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等. 给定一个 ...

  3. leetcode weekly contest 43

    leetcode weekly contest 43 leetcode649. Dota2 Senate leetcode649.Dota2 Senate 思路: 模拟规则round by round ...

  4. LeetCode Weekly Contest 23

    LeetCode Weekly Contest 23 1. Reverse String II Given a string and an integer k, you need to reverse ...

  5. LeetCode Weekly Contest

    链接:https://leetcode.com/contest/leetcode-weekly-contest-33/ A.Longest Harmonious Subsequence 思路:hash ...

  6. LeetCode Weekly Contest 47

    闲着无聊参加了这个比赛,我刚加入战场的时候时间已经过了三分多钟,这个时候已经有20多个大佬做出了4分题,我一脸懵逼地打开第一道题 665. Non-decreasing Array My Submis ...

  7. 75th LeetCode Weekly Contest Champagne Tower

    We stack glasses in a pyramid, where the first row has 1 glass, the second row has 2 glasses, and so ...

  8. LeetCode之Weekly Contest 102

    第一题:905. 按奇偶校验排序数组 问题: 给定一个非负整数数组 A,返回一个由 A 的所有偶数元素组成的数组,后面跟 A 的所有奇数元素. 你可以返回满足此条件的任何数组作为答案. 示例: 输入: ...

  9. LeetCode之Weekly Contest 101

    前一段时间比较忙,而且做这个对于我来说挺耗时间的,已经间隔了几期的没做总结了,后面有机会补齐.而且本来做这个的目的就是为了防止长时间不做把编程拉下,不在追求独立作出所有题了.以后完赛后稍微尝试下,做不 ...

  10. LeetCode之Weekly Contest 92

    第一题:转置矩阵 问题: 给定一个矩阵 A, 返回 A 的转置矩阵. 矩阵的转置是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引. 示例 1: 输入:[[1,2,3],[4,5,6],[7,8,9] ...

随机推荐

  1. java 字符串缓冲区与正则表达式

    一 字符串缓冲区 1.StringBuffer类 查阅StringBuffer的API,StringBuffer又称为可变字符序列,它是一个类似于 String 的字符串缓冲区,通过某些方法调用可以改 ...

  2. 2020-06-02:千万级数据量的list找一个数据。

    福哥答案2020-06-02: 对于千万级长度的数组单值查找:序号小的,单线程占明显优势:序号大的,多线程占明显优势.单线程时间不稳定,多线程时间稳定. go语言测试代码如下: package mai ...

  3. github渗透测试工具库[转载]

    前言 今天看到一个博客里有这个置顶的工具清单,但是发现这些都是很早以前就有文章发出来的,我爬下来后一直放在txt里吃土.这里一起放出来. 漏洞练习平台 WebGoat漏洞练习平台:https://gi ...

  4. Python基础入门知识点——if 语句简介

    前言 if 语句是最简单的选择结构.如果满足条件就执行设定好的操作,不满足条件就执行其他其他操作. 判断的定义 如果 条件满足,才能做某件事情, 如果 条件不满足,就做另外一件事情,或者什么也不做 判 ...

  5. Golang gRPC学习(04): Deadlines超时限制

    为什么要使用Deadlines 当我们使用gRPC时,gRPC库关系的是连接,序列化,反序列化和超时执行.Deadlines 允许gRPC客户端设置自己等待多长时间来完成rpc操作,直到出现这个错误 ...

  6. 使用Axure设计基于中继器的左侧导航菜单

    实现效果: 使用组件: 设计详解: 一.设计外层菜单 1.拖一个矩形,在属性栏中命名cd1,设置宽高为200*45,背景色#393D49,双击设置按钮名称为“默认展开”,字体大小16,字体颜色#C2C ...

  7. css实现网页缩放时固定定位的盒子与版心一同缩放

    在网页设计过程中我们可能会出现这种情况:设置好一个固定定位的盒子,但是当网页缩放时固定定位的盒子与网页的版心分离 这是因为css定位中的固定定位是以页面为参照进行定位的,而不是以版心盒子为参照,那么我 ...

  8. Azure认知服务之使用墨迹识别功能识别手写汉字

    前面我们使用Azure Face实现了人脸识别.使用Azure表格识别器提取了表格里的数据.这次我们试试使用Azure墨迹识别API来对笔迹进行识别. 墨迹识别 墨迹识别器认知服务提供基于云的 RES ...

  9. 3 Spark 集群安装

    第3章 Spark集群安装 3.1 Spark安装地址 1.官网地址 http://spark.apache.org/ 2.文档查看地址 https://spark.apache.org/docs/2 ...

  10. 【翻译】Promises/A+规范

    目录 介绍 译文 1. 术语(Terminology) 2. 要求(Requirements) 2.1 Promise状态 2.2 then方法 2.3 Promise解析程序 3. 注释 3.1 p ...