7-7 leetcode weekly competition(leetcode 第144场周赛)

5117. IP 地址无效化

题面:

给你一个有效的 IPv4 地址 address,返回这个 IP 地址的无效化版本。

所谓无效化 IP 地址,其实就是用 “[.]” 代替了每个 “.”。

示例 1:

输入:address = “1.1.1.1”
输出:“1[.]1[.]1[.]1”
示例 2:

输入:address = “255.100.50.0”
输出:“255[.]100[.]50[.]0”

提示:

给出的 address 是一个有效的 IPv4 地址

题解

首先计算出输入IP地址的长度,然后遍历每一个字符。

如果当前字符为’.’,就在它的前后两侧分别加上’[‘和’]'字符。

值得一提的是,C++的String类型提供了以上操作的函数,我们可以直接调用内部函数,使得我们的程序更加简洁,更加清晰明了。

下面给出AC代码:

class Solution {
public:
    string defangIPaddr(string address) {
        int len = address.size();//直接计算出IP地址的长度
        for (int i = 0; i < len; i++)//遍历每一个字符
        {
            if (address[i] == '.')//如果当前字符为'.'
            {
                address.insert(i, "[");//在它的前面添加'['字符
                address.insert(i + 2, "]");//在它的后面添加']'字符
                i = i + 2;//由于添加了2个字符,因此当前位置应该加上2
                len = len + 2;//字符串长度也要加上2
            }
        }
        return address;//返回处理好的IP地址
    }
};

解析:

  1. 一开头是直接想直接用’[.]‘来代替’.'但其实这样的方法是不行的
  2. 后面想到用链表的方式,但是链表的话,如何把题目给的string转换成list是个问题,以及我不太清楚怎么用链表。。。
  3. 这个解法主要是学到了两个函数string.size()和address.insert(i,"[")

p.s. string.size()和string.length()的不同
    length是因为沿用C语言的习惯而保留下来的,string类最初只有length,引入STL之后,为了兼容又加入了size,它是作为STL容器的属性存在的,便于符合STL的接口规则,以便用于STL的算法。
    string类的size()/length()方法返回的是字节数,不管是否有汉字。

5118. 航班预订统计

题面

这里有 n 个航班,它们分别从 1 到 n 进行编号。

我们这儿有一份航班预订表,表中第 i 条预订记录 bookings[i] = [i, j, k] 意味着我们在从 i 到 j 的每个航班上预订了 k 个座位。

请你返回一个长度为 n 的数组 answer,按航班编号顺序返回每个航班上预订的座位数。

示例:

输入:bookings = [[1,2,10],[2,3,20],[2,5,25]], n = 5
输出:[10,55,45,25,25]

提示:

1 <= bookings.length <= 20000
1 <= bookings[i][0] <= bookings[i][1] <= n <= 20000
1 <= bookings[i][2] <= 10000

题解

设a[i]表示第i个航班预订的座位数。

定义一个差分数组tag[],tag[i]表示第i个航班与第i-1个航班预订座位的差,即tag[i] = a[i] - a[i - 1]。

这样,我们每次扫描到[i, j, k],就只需要将tag[i]增加k,tag[j + 1]减少k即可。

最后,计算a[i] = a[i - 1] + tag[i],返回a即可。

给出代码:

class Solution {
public:
    vector<int> corpFlightBookings(vector<vector<int> >& bookings, int n) {
        int tag[20003], len = bookings.size();//定义tag数组并计算预订表的长度
        vector<int>a(n, 0);//定义一个长度为n且值为0的动态数组
        memset(tag, 0, sizeof(tag));//清零tag数组
        for (int i = 0; i < len; i++) {//扫描每一个预订记录
            tag[bookings[i][0]] += bookings[i][2];//对tag数组进行操作
            tag[bookings[i][1] + 1] -= bookings[i][2];
        }
        for (int i = 0; i < n; i++) {//计算每趟航班预订的座位数
            if (i == 0) a[i] = tag[i + 1];
            else a[i] = a[i - 1] + tag[i + 1];
        }
        return a;//直接返回即可
    }
};

解析:

  1. 运用差分法,其实就是可以这样理解,你如果给第i个航班加了x个座位,然后此时的第i+1个航班他的状态是不变的,那么,此时的i+1个航班就比原来的第i个航班少了x个座位
  2. memset(数组名,赋的值,sizeof(数组名))
  3. vectora(n, 0);//定义一个长度为n且值为0的动态数组

p.s.树状数组应该怎么搞?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值