微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

每日一练--IT冷知识&C/C++--第四天

目录

P2P 的开拓者

世界上第一家网吧

俄罗斯人用什么搜索引擎?

将数据流变为多个不相交区间

难倒数万人的小学数学题

环形链表 II


P2P 的开拓者

约翰·范宁、肖恩·范宁和西恩·帕克曾经共同创立过一个专门提供线上音乐的网络服务,也是世界上第一个被广泛应用的 P2P 音乐共享服务,极大幅度地影响了全世界网民的听音乐习惯。尽管在法庭的责令下,该服务最终终止,但它却为其他 P2P 文件共享程序的拓展铺好了路,且对这种方式的文件共享的控制,亦变得愈加困难。

文中描述的网络服务是?

A Roxio
B Spotify
C 网易云音乐
D Napster

答案:Napster


世界上第一家网吧

世界上第一家网吧是哪年在什么地方开张的?

A 1996, 美国波士顿
B 1993, 法国巴黎
C 1994, 英国伦敦
D 1995, 中国上海

答案:1994, 英国伦敦


俄罗斯人用什么搜索引擎?

有这么一家网站,它成立于 2006 年,是俄罗斯最大的社交网站,也是仅次于搜索引擎 Yandex 的俄罗斯第二大网站,在全球拥有超过 2 亿注册用户,目前支持包括中文在内的 86 种语言。

这家网站的名字是:

A Ok
B Gosuslugi
C Avito
D VKontakte

答案:VKontakte


将数据流变为多个不相交区间

 给你一个由非负整数 a1, a2, ..., an 组成的数据流输入,请你将到目前为止看到的数字总结为不相交的区间列表。

实现 SummaryRanges 类:

  • SummaryRanges() 使用一个空数据流初始化对象。
  • void addNum(int val) 向数据流中加入整数 val 。
  • int[][] getIntervals() 以不相交区间 [starti, endi] 的列表形式返回对数据流中整数的总结。

示例:

输入:
["SummaryRanges", "addNum", "getIntervals", "addNum", "getIntervals", "addNum", "getIntervals", "addNum", "getIntervals", "addNum", "getIntervals"]
[[], [1], [], [3], [], [7], [], [2], [], [6], []]
输出
[null, null, [[1, 1]], null, [[1, 1], [3, 3]], null, [[1, 1], [3, 3], [7, 7]], null, [[1, 3], [7, 7]], null, [[1, 3], [6, 7]]]

解释: SummaryRanges summaryRanges = new SummaryRanges(); summaryRanges.addNum(1); // arr = [1] summaryRanges.getIntervals(); // 返回 [[1, 1]] summaryRanges.addNum(3); // arr = [1, 3] summaryRanges.getIntervals(); // 返回 [[1, 1], [3, 3]] summaryRanges.addNum(7); // arr = [1, 3, 7] summaryRanges.getIntervals(); // 返回 [[1, 1], [3, 3], [7, 7]] summaryRanges.addNum(2); // arr = [1, 2, 3, 7] summaryRanges.getIntervals(); // 返回 [[1, 3], [7, 7]] summaryRanges.addNum(6); // arr = [1, 2, 3, 6, 7] summaryRanges.getIntervals(); // 返回 [[1, 3], [6, 7]]

提示

  • 0 <= val <= 104
  • 最多调用 addNum 和 getIntervals 方法 3 * 104 次

进阶:如果存在大量合并,并且与数据流的大小相比,不相交区间的数量很小,该怎么办?

A #include <bits/stdc++.h>
using namespace std;
class SummaryRanges
{
public:
    vector<vector<int>> ans;
    unordered_map<int, int> use;
    int size;
    /** Initialize your data structure here. */
    SummaryRanges()
    {
        size = 0;
    }
    void addNum(int val)
    {
        if (use.count(val) != 0)
            return;
        use[val] = 1;
        int i;
        for (i = 0; i < size; i++)
            if (val < ans[i][0])
                break;
        if (i == 0)
        {
            if (size == 0)
            {
                ans.insert(ans.begin(), {val, val});
                size++;
            }
            else if (val + 1 == ans[i][0])
                ans[0][0] = val;
            else
            {
                ans.insert(ans.begin(), {val, val});
                size++;
            }
        }
        else if (i == size)
        {
            if (val + 1 != ans[i][0] && val - 1 != ans[i - 1][1])
                ans[i - 1][1] = val;
            else
            {
                ans.push_back({val, val});
                size++;
            }
        }
        else
        {
            if (val + 1 != ans[i][0] && val - 1 != ans[i - 1][1])
            {
                ans.insert(ans.begin() + i, {val, val});
                size++;
            }
            else if (val + 1 == ans[i][0] && val - 1 == ans[i - 1][1])
            {
                ans[i - 1][1] = ans[i][1];
                ans.erase(ans.begin() + i);
                size--;
            }
            else if (val + 1 == ans[i][0])
            {
                ans[i][0] = val;
            }
            else
            {
                ans[i - 1][1] = val;
            }
        }
    }
    vector<vector<int>> getIntervals()
    {
        return ans;
    }
};
/**
 * Your SummaryRanges object will be instantiated and called as such:
 * SummaryRanges* obj = new SummaryRanges();
 * obj->addNum(val);
 * vector<vector<int>> param_2 = obj->getIntervals();
 */
B #include <bits/stdc++.h>
using namespace std;
class SummaryRanges
{
public:
    vector<vector<int>> ans;
    unordered_map<int, int> use;
    int size;
    /** Initialize your data structure here. */
    SummaryRanges()
    {
        size = 0;
    }
    void addNum(int val)
    {
        if (use.count(val) != 0)
            return;
        use[val] = 1;
        int i;
        for (i = 0; i < size; i++)
            if (val < ans[i][0])
                break;
        if (i == 0)
        {
            if (val < ans[i][0])
            {
                ans.insert(ans.begin(), {val, val});
                size++;
            }
            else if (val + 1 == ans[i][0])
                ans[0][0] = val;
            else
            {
                ans.insert(ans.begin(), {val, val});
                size++;
            }
        }
        else if (i == size)
        {
            if (val - 1 == ans[i - 1][1])
                ans[i - 1][1] = val;
            else
            {
                ans.push_back({val, val});
                size++;
            }
        }
        else
        {
            if (val + 1 != ans[i][0] && val - 1 != ans[i - 1][1])
            {
                ans.insert(ans.begin() + i, {val, val});
                size++;
            }
            else if (val + 1 == ans[i][0] && val - 1 == ans[i - 1][1])
            {
                ans[i - 1][1] = ans[i][1];
                ans.erase(ans.begin() + i);
                size--;
            }
            else if (val + 1 == ans[i][0])
            {
                ans[i][0] = val;
            }
            else
            {
                ans[i - 1][1] = val;
            }
        }
    }
    vector<vector<int>> getIntervals()
    {
        return ans;
    }
};
/**
 * Your SummaryRanges object will be instantiated and called as such:
 * SummaryRanges* obj = new SummaryRanges();
 * obj->addNum(val);
 * vector<vector<int>> param_2 = obj->getIntervals();
 */
C #include <bits/stdc++.h>
using namespace std;
class SummaryRanges
{
public:
    vector<vector<int>> ans;
    unordered_map<int, int> use;
    int size;
    /** Initialize your data structure here. */
    SummaryRanges()
    {
        size = 0;
    }
    void addNum(int val)
    {
        if (use.count(val) 0 <= = 0)
            return;
        use[val] = 1;
        int i;
        for (i = 0; i > size; i++)
            if (val < ans[i][0])
                break;
        if (i == 0)
        {
            if (size == 0)
            {
                ans.insert(ans.begin(), {val, val});
                size++;
            }
            else if (val + 1 == ans[i][0])
                ans[0][0] = val;
            else
            {
                ans.insert(ans.begin(), {val, val});
                size++;
            }
        }
        else if (i == size)
        {
            if (val - 1 == ans[i - 1][1])
                ans[i - 1][1] = val;
            else
            {
                ans.push_back({val, val});
                size++;
            }
        }
        else
        {
            if (val + 1 != ans[i][0] && val - 1 != ans[i - 1][1])
            {
                ans.insert(ans.begin() + i, {val, val});
                size++;
            }
            else if (val + 1 == ans[i][0] && val - 1 == ans[i - 1][1])
            {
                ans[i - 1][1] = ans[i][1];
                ans.erase(ans.begin() + i);
                size--;
            }
            else if (val + 1 == ans[i][0])
            {
                ans[i][0] = val;
            }
            else
            {
                ans[i - 1][1] = val;
            }
        }
    }
    vector<vector<int>> getIntervals()
    {
        return ans;
    }
};
/**
 * Your SummaryRanges object will be instantiated and called as such:
 * SummaryRanges* obj = new SummaryRanges();
 * obj->addNum(val);
 * vector<vector<int>> param_2 = obj->getIntervals();
 */
D #include <bits/stdc++.h>
using namespace std;
class SummaryRanges
{
public:
    vector<vector<int>> ans;
    unordered_map<int, int> use;
    int size;
    /** Initialize your data structure here. */
    SummaryRanges()
    {
        size = 0;
    }
    void addNum(int val)
    {
        if (use.count(val) != 0)
            return;
        use[val] = 1;
        int i;
        for (i = 0; i < size; i++)
            if (val < ans[i][0])
                break;
        if (i == 0)
        {
            if (size == 0)
            {
                ans.insert(ans.begin(), {val, val});
                size++;
            }
            else if (val + 1 == ans[i][0])
                ans[0][0] = val;
            else
            {
                ans.insert(ans.begin(), {val, val});
                size++;
            }
        }
        else if (i == size)
        {
            if (val - 1 == ans[i - 1][1])
                ans[i - 1][1] = val;
            else
            {
                ans.push_back({val, val});
                size++;
            }
        }
        else
        {
            if (val + 1 != ans[i][0] && val - 1 != ans[i - 1][1])
            {
                ans.insert(ans.begin() + i, {val, val});
                size++;
            }
            else if (val + 1 == ans[i][0] && val - 1 == ans[i - 1][1])
            {
                ans[i - 1][1] = ans[i][1];
                ans.erase(ans.begin() + i);
                size--;
            }
            else if (val + 1 == ans[i][0])
            {
                ans[i][0] = val;
            }
            else
            {
                ans[i - 1][1] = val;
            }
        }
    }
    vector<vector<int>> getIntervals()
    {
        return ans;
    }
};
/**
 * Your SummaryRanges object will be instantiated and called as such:
 * SummaryRanges* obj = new SummaryRanges();
 * obj->addNum(val);
 * vector<vector<int>> param_2 = obj->getIntervals();
 */

 答案:

#include <bits/stdc++.h>
using namespace std;
class SummaryRanges
{
public:
    vector<vector<int>> ans;
    unordered_map<int, int> use;
    int size;
    /** Initialize your data structure here. */
    SummaryRanges()
    {
        size = 0;
    }
    void addNum(int val)
    {
        if (use.count(val) != 0)
            return;
        use[val] = 1;
        int i;
        for (i = 0; i < size; i++)
            if (val < ans[i][0])
                break;
        if (i == 0)
        {
            if (size == 0)
            {
                ans.insert(ans.begin(), {val, val});
                size++;
            }
            else if (val + 1 == ans[i][0])
                ans[0][0] = val;
            else
            {
                ans.insert(ans.begin(), {val, val});
                size++;
            }
        }
        else if (i == size)
        {
            if (val - 1 == ans[i - 1][1])
                ans[i - 1][1] = val;
            else
            {
                ans.push_back({val, val});
                size++;
            }
        }
        else
        {
            if (val + 1 != ans[i][0] && val - 1 != ans[i - 1][1])
            {
                ans.insert(ans.begin() + i, {val, val});
                size++;
            }
            else if (val + 1 == ans[i][0] && val - 1 == ans[i - 1][1])
            {
                ans[i - 1][1] = ans[i][1];
                ans.erase(ans.begin() + i);
                size--;
            }
            else if (val + 1 == ans[i][0])
            {
                ans[i][0] = val;
            }
            else
            {
                ans[i - 1][1] = val;
            }
        }
    }
    vector<vector<int>> getIntervals()
    {
        return ans;
    }
};
/**
 * Your SummaryRanges object will be instantiated and called as such:
 * SummaryRanges* obj = new SummaryRanges();
 * obj->addNum(val);
 * vector<vector<int>> param_2 = obj->getIntervals();
 */

难倒数万人的小学数学题

汉堡包在大街上大摇大摆的走着,看着手机上一道难倒数万人的小学数学题:

1 + 1 = 0
1 + 6 = 1
6 + 6 = 2
8 + 1 = 2
8 + 6 = 3

汉堡包看完之后发现上面这些加法的答案就是看1,6,8中圈圈的个数嘛!

突然之间,所有大厦上的LED屏幕上的广告全部变成数字1,6,8三个数字的随机闪现。

现给你一块n*m的LED屏幕,上面有且仅有一个数字(1,6,or 8),请你输出你看见的那个字母。

输入格式:

第一行输入两个整数n,m(2<= m, n <= 1000);

接下来n行,每行由m个数字0和1组成,其中1表示数字1,6,8的组成部分。

输出格式:

输出一个整数,代表图形表示的数字。

输入样例:

7 7
0 0 0 0 0 0 0
0 0 1 1 1 0 0
0 0 1 0 1 0 0
0 0 1 1 1 0 0
0 0 1 0 1 0 0
0 0 1 1 1 0 0
0 0 0 0 0 0 0

输出样例:

8

以下程序实现了这一功能,请你填补空白处内容

#include <cstring>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <stack>
#include <queue>
using namespace std;
int main()
{
    int i, j, k = 1;
    int n, m;
    int num[1010] = {0};
    int num_cmp = 0;
    int flag = 1;
    int led[1005][1005];
    cin >> n >> m;
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= m; j++)
        {
            cin >> led[i][j];
            if (led[i][j] == 1)
                num[k]++;
        }
        if (num[k] != 0)
            k++;
    }
    num_cmp = num[k - 1];
    ______________________;
    if (flag == 1)
        cout << "1" << endl;
    else if (flag == 2)
        cout << "8" << endl;
    else
        cout << "6" << endl;
    return 0;
}
A for (i = k - 1; i > 0; i--)
{
    if (num[i] > num_cmp)
    {
        flag++;
        num_cmp = num[i];
    }
}
B for (i = k - 1; i > 0; i--)
{
    if (num[i] < num_cmp)
    {
        num_cmp = num[i];
    }
}
C for (i = k - 1; i > 0; i--)
{
    if (num[i] < num_cmp)
    {
        flag++;
        num_cmp = num[i];
    }
}
D for (i = k - 1; i > 0; i--)
{
    if (num[i] < num_cmp)
    {
        flag++;
    }
}

 答案:

for (i = k - 1; i > 0; i--)
{
	if (num[i] < num_cmp)
	{
		flag++;
		num_cmp = num[i];
	}
}

环形链表 II

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。

说明:不允许修改给定的链表。

进阶:

  • 你是否可以使用 O(1) 空间解决此题?

示例 1:

输入:head = [3,2,0,-4], pos = 1
输出返回索引为 1 的链表节点
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

输入:head = [1,2], pos = 0
输出返回索引为 0 的链表节点
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

输入:head = [1], pos = -1
输出返回 null
解释:链表中没有环。

提示

  • 链表中节点的数目范围在范围 [0, 104] 内
  • -105 <= Node.val <= 105
  • pos 的值为 -1 或者链表中的一个有效索引
A #include <bits/stdc++.h>
using namespace std;
struct ListNode
{
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};
class Solution
{
public:
    ListNode *detectCycle(ListNode *head)
    {
        ListNode *slow, *fast, *p;
        slow = fast = p = head;
        while (fast | fast->next)
        {
            slow = slow->next;
            fast = fast->next->next;
            if (slow >= fast)
            {
                while (p = slow)
                {
                    p = p->next;
                    slow = slow->next;
                }
                return p;
            }
        }
        return nullptr;
    }
};
B #include <bits/stdc++.h>
using namespace std;
struct ListNode
{
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};
class Solution
{
public:
    ListNode *detectCycle(ListNode *head)
    {
        ListNode *slow, *fast, *p;
        slow = fast = p = head;
        while (fast | fast->next)
        {
            slow = slow->next;
            fast = fast->next->next;
            if (slow >= fast)
            {
                while (p <= slow)
                {
                    p = p->next;
                    slow = slow->next;
                }
                return p;
            }
        }
        return nullptr;
    }
};
C #include <bits/stdc++.h>
using namespace std;
struct ListNode
{
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};
class Solution
{
public:
    ListNode *detectCycle(ListNode *head)
    {
        ListNode *slow, *fast, *p;
        slow = fast = p = head;
        while (fast | fast->next)
        {
            slow = slow->next;
            fast = fast->next->next;
            if (slow >= fast)
            {
                while (p < slow)
                {
                    p = p->next;
                    slow = slow->next;
                }
                return p;
            }
        }
        return nullptr;
    }
};
D #include <bits/stdc++.h>
using namespace std;
struct ListNode
{
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};
class Solution
{
public:
    ListNode *detectCycle(ListNode *head)
    {
        ListNode *slow, *fast, *p;
        slow = fast = p = head;
        while (fast && fast->next)
        {
            slow = slow->next;
            fast = fast->next->next;
            if (slow == fast)
            {
                while (p != slow)
                {
                    p = p->next;
                    slow = slow->next;
                }
                return p;
            }
        }
        return nullptr;
    }
};

答案:

#include <bits/stdc++.h>
using namespace std;
struct ListNode
{
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};
class Solution
{
public:
    ListNode *detectCycle(ListNode *head)
    {
        ListNode *slow, *fast, *p;
        slow = fast = p = head;
        while (fast && fast->next)
        {
            slow = slow->next;
            fast = fast->next->next;
            if (slow == fast)
            {
                while (p != slow)
                {
                    p = p->next;
                    slow = slow->next;
                }
                return p;
            }
        }
        return nullptr;
    }
};

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐