前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >LeetCode Weekly Contest 22(双周赛)

LeetCode Weekly Contest 22(双周赛)

作者头像
wywwzjj
发布于 2023-05-09 06:39:23
发布于 2023-05-09 06:39:23
19700
代码可运行
举报
运行总次数:0
代码可运行

总的来说题目挺简单的。晚上做题注意力没那么集中,看错几次题,浪费不少时间,可惜了。

两个数组间的距离值

题目描述

给你两个整数数组 arr1 , arr2 和一个整数 d ,请你返回两个数组之间的距离值 。

距离值定义为符合此描述的元素数目:对于元素 arr1[i] ,不存在任何元素 arr2[j] 满足 |arr1[i]-arr2[j]| <= d

解法

两重循环遍历一下就行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func findTheDistanceValue(arr1 []int, arr2 []int, d int) int {
    ans := 0
    for i := range arr1 {
        flag := true
        for j := range arr2 {
            if abs(arr1[i]-arr2[j]) <= d {
                flag = false
                break
            }
        }
        if flag {
            ans++
        }
    }
   	return ans
}

func abs(x int) int {
    if x > 0 {
        return x
    }
    return -x
}

安排电影院座位

题目描述

如上图所示,电影院的观影厅中有 n 行座位,行编号从 1 到 n ,且每一行内总共有 10 个座位,列编号从 1 到 10

给你数组 reservedSeats,包含所有已经被预约了的座位。比如说,researvedSeats[i] = [3,8] ,它表示第 3 行第 8 个座位被预约了。

请你返回最多能安排多少个 4 人家庭 。4 人家庭要占据 同一行内连续 的 4 个座位。隔着过道的座位(比方说 [3,3] 和 [3,4])不是连续的座位,但是如果你可以将 4 人家庭拆成过道两边各坐 2 人,这样子是允许的。

提示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 <= n <= 10^9
1 <= reservedSeats.length <= min(10*n, 10^4)
reservedSeats[i].length == 2
1 <= reservedSeats[i][0] <= n
1 <= reservedSeats[i][1] <= 10
所有 reservedSeats[i] 都是互不相同的。

解法

由于限制了跨过道的坐法只能有一种,即每边坐两人,所以每一排座位的坐法就只有 4 种情况。

  • 4、5、6、7
  • 2、3、4、5
  • 6、7、8、9
  • 2、3、4、5 和 6、7、8、9

题目求的是最多能安排多少个家庭座位,所以第四种优先安排。

剩下的难点在于数据量比较大,如果直接遍历 n 是会超时的。

注意到 reservedSeats.length <= min(10*n, 10^4),范围比较小,就从这下手。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func maxNumberOfFamilies(n int, reservedSeats [][]int) int {
    m := make(map[int][]bool)
    for _, reservedSeat := range reservedSeats {
        if len(m[reservedSeat[0]]) == 0 {
            m[reservedSeat[0]] = make([]bool, 11)
        }
        m[reservedSeat[0]][reservedSeat[1]] = true
    }
    ans := 0
    for _, isSeat := range m {  // 只关注有座位被占用的部分,整排为空的一定能坐下两家庭
        if isSeat[2] || isSeat[3] || isSeat[8] || isSeat[9] {
            if !isSeat[4] && !isSeat[5] && !isSeat[6] && !isSeat[7] {
                ans++
                continue
            }
        }
        if !isSeat[2] && !isSeat[3] && !isSeat[4] && !isSeat[5] {
            ans++
        }
        if !isSeat[6] && !isSeat[7] && !isSeat[8] && !isSeat[9] {
            ans++
        }
    }
    return 2*(n-len(m)) + ans  // 空座位一定能坐下两个家庭
}

还有一种思路,每个座位只有被占用 / 空两种状态,很容易想到用位运算处理。

将整数按权重排序

题目描述

我们将整数 x 的 权重 定义为按照下述规则将 x 变成 1 所需要的步数:

如果 x 是偶数,那么 x = x / 2 如果 x 是奇数,那么 x = 3 * x + 1

比方说,x=3 的权重为 7 。因为 3 需要 7 步变成 1 (3 –> 10 –> 5 –> 16 –> 8 –> 4 –> 2 –> 1)。

给你三个整数 lo, hi 和 k 。你的任务是将区间 [lo, hi] 之间的整数按照它们的权重 升序排序 ,如果大于等于 2 个整数有 相同 的权重,那么按照数字自身的数值 升序排序 。

请你返回区间 [lo, hi] 之间的整数按权重排序后的第 k 个数。

注意,题目保证对于任意整数 x (lo <= x <= hi) ,它变成 1 所需要的步数是一个 32 位有符号整数。

提示:

  • 1 <= lo <= hi <= 1000
  • 1 <= k <= hi - lo + 1

解法

一开始纠结了一会求权重,后面发现直接模拟就好了,并不是每次决策,求最小步数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func getKth(lo, hi, k int) int {
    power := make(map[int]int)
    arr := make([]int, hi-lo+1)
    for i := lo; i <= hi; i++ {
        arr[i-lo] = i
        getPower(i, power)
    }

    // 到这里就变成了常规 Top K 问题,简单做下排序吧,注意要稳定排序
    sort.Slice(arr, func(i, j int) bool {
        if power[arr[i]] != power[arr[j]] {
            return power[arr[i]] < power[arr[j]]
        }
        return arr[i] < arr[j] // 相等的留在原地
    })

    return arr[k-1]
}

func getPower(x int, power map[int]int) int {
    ans, tmp := 0, x
    for x != 1 {
        if x&1 == 1 {
            x = 3*x + 1
        } else {
            x /= 2
        }
        ans++
        if val, ok := power[x]; ok {
            ans += val
            break
        }
    }
    power[tmp] = ans
    return ans
}

3n 块披萨

题目描述

给你一个披萨,它由 3n 块不同大小的部分组成,现在你和你的朋友们需要按照如下规则来分披萨:

你挑选任意 一块披萨。

Alice 将会挑选你所选择的披萨逆时针方向的下一块披萨。

Bob 将会挑选你所选择的披萨顺时针方向的下一块披萨。

重复上述过程直到没有披萨剩下。

每一块披萨的大小按顺时针方向由循环数组 slices 表示。

请你返回你可以获得的披萨大小总和的最大值。

示例 1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:slices = [1,2,3,4,5,6]
输出:10
解释:选择大小为 4 的披萨,Alice 和 Bob 分别挑选大小为 35 的披萨。然后你选择大小为 6 的披萨,Alice 和 Bob 分别挑选大小为 21 的披萨。你获得的披萨总大小为 4 + 6 = 10

示例 2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:slices = [8,9,8,6,1,1]
输出:16
解释:两轮都选大小为 8 的披萨。如果你选择大小为 9 的披萨,你的朋友们就会选择大小为 8 的披萨,这种情况下你的总和不是最大的。

示例 3:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:slices = [4,1,2,5,8,3,1,9,7]
输出:21

示例 4:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:slices = [3,1,2]
输出:3

提示:

  • 1 <= slices.length <= 500
  • slices.length % 3 == 0
  • 1 <= slices[i] <= 1000

解法

这题直接贪心显然不行,两个特点,一个是形成环,并且选了这个,其左右两边的将被丢弃。

很容易联想到类似的题,即打家劫舍系列里的不能偷相邻的,以及房子围成圆形。

所以问题就转化为——不相邻有限子数列的最大和,该子数列不能同时包含首尾。

即在大小为 3n 的数组中挑选 n 个满足上面条件的数。比如 1~9 披萨时的情况,只能拿走三份。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  idx 1 2 3 4 5 6 7 8 9
case1 -   -   -
case2 -   -       -
case3 -     -   -
case4   -     -   -
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// TODO 代码还有点小问题,需要调调
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/03/22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
J2SE1.5的新特点(之一)
J2SE1.5的新特点<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> <?xml:namesp
田春峰-JCJC错别字检测
2019/02/14
5430
Java面试集合(二)
4.简单说说String类和StringBuffer类之间的区别? 答:String类是不可变的类,字符串一旦被初始化就不可能改变;StringBuffer是可变的字符串类,可以修改字符串的值。
达达前端
2019/07/03
3980
五、集合基础【黑马JavaSE笔记】
注:以上方法时List集合特有的方法,Collection集合没有这些方法,但是ArrayLIst集合有这些方法,因为ArrayList继承自List集合。
啵啵鱼
2022/11/23
7580
五、集合基础【黑马JavaSE笔记】
第50节:Java当中的泛型
这就存在一个问题,如果集合存储元素时,而且存储对象有很多,而且对象类型不相同,就很容易导致隐患。
达达前端
2019/07/03
6960
第50节:Java当中的泛型
【小家java】java5新特性(简述十大新特性) 重要一跃
所谓类型擦除指的就是Java源码中的范型信息只允许停留在编译前期,而编译后的字节码文件中将不再保留任何的范型信息。也就是说,范型信息在编译时将会被全部删除,其中范型类型的类型参数则会被替换为Object类型,并在实际使用时强制转换为指定的目标数据类型。而C++中的模板则会在编译时将模板类型中的类型参数根据所传递的指定数据类型生成相对应的目标代码。
YourBatman
2019/09/03
5650
Java 基础 -- 泛型、集合、IO、反射
计划把 Java 基础的有些部分再次看一遍,巩固一下,下面以及以后就会分享自己再次学习的一点笔记!不是有关标题的所有知识点,只是自己觉得模糊的一些知识点。 1.  对于泛型类而言,你若没有指明其类型,默认为Object; 2.  在继承泛型类以及接口的时候可以指明泛型的类型,也可以不指明; 3.   泛型也数据库中的应用:       写一个 DAO 类对数据库中的数据进行增删改查其类型声明为 <T> 。每张表对应一个类,对应每一张表实现一个类继承该 DAO 类并指明 DAO 泛型为该数据表对应的类,再实现
bgZyy
2018/05/16
9540
String、StringBuffer、StringBuilder三者之间的区别
String是不可变类,所以任何对String的操作都将引发新的String对象的生成。但是StringBuffer是可变类,任何对StringBuffer所指代的字符串改变都不会产生新的对象。
Michel_Rolle
2023/07/30
2.7K0
07 - JavaSE之容器
Collection 接口的子接口分为:Set接口(包含 HashSet类) + List接口(包含LinkedList 类和 ArrayLis t类) Map接口:包含HashMap类
Daotin
2018/08/31
3560
07 - JavaSE之容器
奇奇怪怪的面试题
两个线程并发执行下列代码,其中直接使用线程安全类ConcurrentHashMap的put方法时不需要考虑多线程间互相覆盖的问题。
九转成圣
2024/04/10
930
设计模式之访问者模式(行为型)
访问者模式:表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。所以访问者模式是一种对象行为型模式。
SmileNicky
2019/03/20
5520
Java 集合框架(List、Set、Map、Iterator、Stack、Properties)
相关文献:https://www.runoob.com/java/java-collections.html
Michael阿明
2021/09/06
3010
SpringBoot + ITextPdf:高效生成 PDF 预览文件
其实公司之前的项目里是用到了帆软报表的,然而最近接了一个新项目,这个项目独立部署在甲方的独立环境中,组长的意思是不用再单独部署一套帆软报表,成本太大,用其他方式实现一下。虽然我不太理解成本大在哪儿,不过身为助理工程师,别管那么多,照着干就完事了。
程序员皮皮林
2024/10/08
9760
SpringBoot + ITextPdf:高效生成 PDF 预览文件
JAVA: List用法
1、List中可以添加任何对象,包括自己定义的新的类。 class Person{ ..... } 上面定义了一个Person类,下面看好如何使用List Person p1=new Person(); Person p2=new Person(); List list=new ArrayList(); list.add(p1); list.add(p2);//这里是将对象加入到list中 for(int i=0;i Person p=(Person)list.get(i);//注意,这里一定要强制类型转
战神伽罗
2019/07/22
3.7K0
Map的5种遍历方法
//循环遍历map的方法 public class MapF { public static void main(String[] args) { Map<String, Integer> tempMap = new HashMap<String, Integer>(); tempMap.put("a","12"); tempMap.put("b","34"); tempMap.put("c","56");
挨踢小子部落阁
2023/03/16
6500
Map的5种遍历方法
Java 集合demo学习
以下实例演示了使用 Java Util 类的 Arrays.asList(name) 方法将数组转换为集合:
默 语
2024/11/20
460
Springboot输出PDF文件
有个人(死需求)跑过来跟你说,这些都给我输出成报告,pdf格式的,所以就有了下面这个,做一下笔记,以后有用直接过来拿。在网上找了一下,发现大家都是在用itext。iText是著名的开放项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。
用户3467126
2019/09/27
3K2
Springboot输出PDF文件
Java基础教程--安卓入门教程(七)
接口的基本语法 接口的基本语法(一) 使用interface定义 接口当中的方法都是抽象方法; 接口当中的方法都是public权限 接口中全是抽象函数,不能生成对象 interface USB{  public void read();  public void write(); } class USBPhone implements USB{ //复写  public void read(){   System.out.println("USBPhone read");  }  public void write(){   System.out.println("USBPhone write");  } } class Test{  public static void main(String args[]){   USBPhone usbPhone = new USBPhone();   USB usb = usbPhone;   usb.read();   usb.write();  } }
达达前端
2022/04/29
7000
Java基础教程--安卓入门教程(七)
JDK源码阅读:ArrayList原理
查询快:由于数组在内存中是一块连续空间,因此可以根据地址+索引的方式快速获取对应位置上的元素。
鳄鱼儿
2024/05/21
1320
Java基础之集合
-集合结构只要发生改变,迭代器必须重新获取,如果还是用的之前的迭代器,就会出现异常java.util.ConcurrentModificationException
shaoshaossm
2022/12/27
5330
Java基础之集合
itext7知识点研究(PDF编辑)
static class MyEventListener implements IEventListener { private List<Rectangle> rectangles = new ArrayList<>(); @Override public void eventOccurred(IEventData data, EventType type) { if (type == EventType.RENDER_TEXT) { TextRenderInfo renderInfo = (TextRenderInfo) data; Vector startPoint = renderInfo.getDescentLine().getStartPoint(); Vector endPoint = renderInfo.getAscentLine().getEndPoint(); float x1 = Math.min(startPoint.get(0), endPoint.get(0)); float x2 = Math.max(startPoint.get(0), endPoint.get(0)); float y1 = Math.min(startPoint.get(1), endPoint.get(1)); float y2 = Math.max(startPoint.get(1), endPoint.get(1)); rectangles.add(new Rectangle(x1, y1, x2 - x1, y2 - y1)); } } @Override public Set<EventType> getSupportedEvents() { return new LinkedHashSet<>(Collections.singletonList(EventType.RENDER_TEXT)); } public List<Rectangle> getRectangles() { return rectangles; } public void clear() { rectangles.clear(); } } static class MyCharacterEventListener extends MyEventListener { @Override public void eventOccurred(IEventData data, EventType type) { if (type == EventType.RENDER_TEXT) { TextRenderInfo renderInfo = (TextRenderInfo) data; for (TextRenderInfo tri : renderInfo.getCharacterRenderInfos()) { super.eventOccurred(tri, type); } } } }
老梁
2019/09/10
2.8K0
itext7知识点研究(PDF编辑)
相关推荐
J2SE1.5的新特点(之一)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验