C/C++每日一练(20230226)

简介: C/C++每日一练(20230226)

1. 电话号码的字母组合


给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

71e2c27cd43a6f678c1972f865e982d0.png


示例 1:

输入:digits = "23"

输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]


示例 2:

输入:digits = ""

输出:[]


示例 3:

输入:digits = "2"

输出:["a","b","c"]


提示:

   0 <= digits.length <= 4

   digits[i] 是范围 ['2', '9'] 的一个数字。

代码:


#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
    vector<string> str;
    vector<string> ret;
    string getStr( int x ) {
        switch( x ) {
            case 2: return "abc";
            case 3: return "def";
            case 4: return "ghi";
            case 5: return "jkl";
            case 6: return "mno";
            case 7: return "pqrs";
            case 8: return "tuv";
            case 9: return "wxyz";
            default: return "";
        }
    }
    void dfs( string& ans, int k ) {
        if ( k >= str.size() ) {
            ret.push_back( ans );
            return;
        }
        for ( auto& it : str[k] ) {
            ans.push_back( it );
            dfs(ans, k + 1);
            ans.pop_back();
        }
    }
    vector<string> letterCombinations(string digits) {
        if ( !digits.size() ) return {};
        for ( auto& it : digits ) 
            str.push_back( getStr( it & 15 ) );
        string ans = "";
        dfs( ans, 0 );
        return ret;
    }
};
int main()
{
  Solution s1;
  string digits = "23";
  for (auto comb : s1.letterCombinations(digits))
    cout << comb << " ";
  cout <<endl;
  Solution s2;
  digits = "";
  for (auto comb : s2.letterCombinations(digits))
    cout << comb << " ";
  cout <<endl;
  Solution s3;
  digits = "2";
  for (auto comb : s3.letterCombinations(digits))
    cout << comb << " ";
  return 0;
} 


输出:

ad ae af bd be bf cd ce cf

# 注意此行为空

a b c

其他3种代码:

代码1:

#include <bits/stdc++.h>
using namespace std;
class Solution
{
public:
    vector<string> result;
    vector<string> letterCombinations(string digits)
    {
        string temp;
        if (digits.length() == 0)
            return result;
        getAns(digits, 0, temp, result);
        return result;
    }
    void getAns(string digits, int start, string temp, vector<string> &result)
    {
        if (temp.size() == digits.length())
            result.push_back(temp);
        else
        {
            vector<char> let = getLet(digits[start]);
            for (int i = 0; i < let.size(); i++)
            {
                temp.append(1, let[i]);
                getAns(digits, start + 1, temp, result);
                temp.pop_back();
            }
        }
    }
    vector<char> getLet(char i)
    {
        vector<char> let;
        switch(i){
    case '2':
            let.push_back('a');
            let.push_back('b');
            let.push_back('c');
          break;
        case '3':
            let.push_back('d');
            let.push_back('e');
            let.push_back('f');
          break;
        case '4':
            let.push_back('g');
            let.push_back('h');
            let.push_back('i');
          break;
        case '5':
            let.push_back('j');
            let.push_back('k');
            let.push_back('l');
          break;
        case '6':
            let.push_back('m');
            let.push_back('n');
            let.push_back('o');
          break;
        case '7':
            let.push_back('p');
            let.push_back('q');
            let.push_back('r');
            let.push_back('s');
          break;
        case '8':
            let.push_back('t');
            let.push_back('u');
            let.push_back('v');
          break;
        case '9':
            let.push_back('w');
            let.push_back('x');
            let.push_back('y');
            let.push_back('z');
          break;
    default: break;
    }
        return let;
    }
};
int main()
{
  Solution s1;
  string digits = "23";
  for (auto comb : s1.letterCombinations(digits))
    cout << comb << " ";
  cout <<endl;
  Solution s2;
  digits = "";
  for (auto comb : s2.letterCombinations(digits))
    cout << comb << " ";
  cout <<endl;
  Solution s3;
  digits = "2";
  for (auto comb : s3.letterCombinations(digits))
    cout << comb << " ";
  return 0;
} 


代码2:

#include <bits/stdc++.h>
using namespace std;
class Solution
{
public:
    unordered_map<char, string> map = {{'2', "abc"}, {'3', "def"}, {'4', "ghi"}, {'5', "jkl"}, {'6', "mno"}, {'7', "pqrs"}, {'8', "tuv"}, {'9', "wxyz"}};
    vector<string> res;
    void backtrack(string &s, int index, string cur)
    {
        if (index == s.size())
        {
            res.push_back(cur);
            return;
        }
        for (int i = 0; i < map[s[index]].size(); ++i)
            backtrack(s, index + 1, cur + map[s[index]][i]);
    }
    vector<string> letterCombinations(string digits)
    {
        if (digits.size() == 0)
            return res;
        string cur;
        backtrack(digits, 0, cur);
        return res;
    }
};
int main()
{
  Solution s1;
  string digits = "23";
  for (auto comb : s1.letterCombinations(digits))
    cout << comb << " ";
  cout <<endl;
  Solution s2;
  digits = "";
  for (auto comb : s2.letterCombinations(digits))
    cout << comb << " ";
  cout <<endl;
  Solution s3;
  digits = "2";
  for (auto comb : s3.letterCombinations(digits))
    cout << comb << " ";
  return 0;
} 

代码3:

#include <bits/stdc++.h>
using namespace std;
class Solution
{
public:
    vector<string> letterCombinations(string digits)
    {
        if (digits.size() == 0)
            return {};
        map<char, string> a;
        a.insert(map<char, string>::value_type('2', "abc"));
        a.insert(map<char, string>::value_type('3', "def"));
        a.insert(map<char, string>::value_type('4', "ghi"));
        a.insert(map<char, string>::value_type('5', "jkl"));
        a.insert(map<char, string>::value_type('6', "mno"));
        a.insert(map<char, string>::value_type('7', "pqrs"));
        a.insert(map<char, string>::value_type('8', "tuv"));
        a.insert(map<char, string>::value_type('9', "wxyz"));
        int count = 1;
        for (int i = 0; i < digits.size(); i++)
        {
            count *= a[digits[i]].size();
        }
        vector<string> res(count);
        count = 1;
        for (int i = 0; i < digits.size(); i++)
        {
            int index = 0;
            vector<string> temp(res.begin(), res.begin() + count);
            for (int k = 0; k < count; k++)
            {
                for (auto c : a[digits[i]])
                {
                    res[index] = temp[k] + c;
                    index++;
                }
            }
            count *= a[digits[i]].size();
        }
        return res;
    }
};
int main()
{
  Solution s1;
  string digits = "23";
  for (auto comb : s1.letterCombinations(digits))
    cout << comb << " ";
  cout <<endl;
  Solution s2;
  digits = "";
  for (auto comb : s2.letterCombinations(digits))
    cout << comb << " ";
  cout <<endl;
  Solution s3;
  digits = "2";
  for (auto comb : s3.letterCombinations(digits))
    cout << comb << " ";
  return 0;
} 




2. 删除链表倒数第 N 个结点


给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。


进阶:你能尝试使用一趟扫描实现吗?

示例 1:

3ab1d7132da7283b4578c8df78c8fb67.jpeg



输入:head = [1,2,3,4,5], n = 2

输出:[1,2,3,5]


示例 2:

输入:head = [1], n = 1

输出:[]


示例 3:

输入:head = [1,2], n = 1

输出:[1]


提示:


   链表中结点的数目为 sz

   1 <= sz <= 30

   0 <= Node.val <= 100

   1 <= n <= sz

#include <bits/stdc++.h>
using namespace std;
struct ListNode
{
  int val;
  ListNode *next;
  ListNode() : val(0), next(nullptr) {}
  ListNode(int x) : val(x), next(nullptr) {}
  ListNode(int x, ListNode *next) : val(x), next(next) {}
};
class Solution
{
public:
  ListNode *removeNthFromEnd(ListNode *head, int n)
  {
    ListNode empty_node(0, head);
    ListNode *p = &empty_node;
    std::vector<ListNode *> pv;
    while (p != nullptr)
    {
      pv.push_back(p);
      p = p->next;
    }
    p = pv[pv.size() - 1 - n];
    p->next = p->next->next;
    return empty_node.next;
  }
};
ListNode* CreateList(vector<int>& nums) 
{
  ListNode *head, *temp, *node;
  head = nullptr;
  temp = nullptr;
  for (const auto data : nums)
  {
    node = new ListNode;
    node->val = data;
    if (head == nullptr) 
      head = node;
    else
      temp->next = node;
    temp = node;
    temp->next = nullptr;
  }
  return head;
}
void PrintList(ListNode* p) 
{
  while(p->next != nullptr)
  {
    cout << p->val << "->";
    p = p->next;
  }
  cout << p->val << endl;
}
int main()
{
  Solution s;
  ListNode* head = (ListNode*)malloc(sizeof(ListNode));
  vector <int> nums = {1,2,3,4,5};
  head = CreateList(nums); 
  PrintList(head);
  head = s.removeNthFromEnd(head, 2);
  PrintList(head);
  return 0;
} 




输出:

   1->2->3->4->5

   1->2->3->5

   1

   (null)

   1->2

   1

   --------------------------------

   Process exited after 0.02629 seconds with return value 0

   请按任意键继续. . .




3. 海港(port)


问题描述


小谢是海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客。

小谢对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况;对于第i艘到达的船,他记录了这艘船只到达的时间ti(单位:秒),船上的乘客数量Ki,以及每名乘客的国籍x(i,1),x(i,2),···,x(i,k)。


小谢统计了n艘船的信息,希望你帮忙计算出以每一艘船到达时间为止的24小时(24小时=86400秒)内所有乘船到达的乘客来自多少个不同的国家。


形式化的讲,你需要计算n条信息。对于输出的第i条信息,你需要统计满足:ti-86400<tp<=ti的船只p,在所有的x(p,j)中,总共有多少个不同的数。




输入格式


第1行输入一个正整数n,表示小谢统计了n艘船的信息。


接下来的n行,每行描述一艘船的信息:前两个整数ti和ki分别表示这艘船到达海港的时间和船上的乘客数量,接下来的ki个整数x(i,j)表示从小谢第一次上班开始计时,这艘船在第ti秒到达海港。


保证1<=n<=105,ki>=1,∑ki<=3×105,1<=x(i,j)<=105,1<=ti-1<ti<=109。其中∑ki表示所有ki的和。输出格式


输出n行,第i行输出一个整数表示第i艘船到达后的统计信息。


输入样例1

1. 3
2. 1 4 4 1 2 2
3. 2 2 2 3
4. 10 1 3


输出样例1

1. 3
2. 4
3. 4



样例1说明:第一艘船在第一秒到达海港,最近24小时到达的船是第一艘船,共4个乘客,分别来自国家4,1,2,2,共来自3个不同的国家。


第2艘船在第2秒到达海港,最近24小时到达的船是第1艘船和第2艘船,共有4+2=6个乘客,分别来自国家4,1,2,2,2,3,共来自4个不同的国家;


第三艘船在第10秒到达海港,最近24小时到达的船是第1艘船、第2艘船和第3艘船,共有4+2+1=7个乘客,分别是来自国家4,1,2,2,2,3,3,共来自4个不同的国家。



输入样例2

1. 4
2. 1 4 1 2 2 3
3. 3 2 2 3
4. 86401 2 3 4
5. 86402 1 5


输出样例2

1. 3
2. 3
3. 3
4. 4


样例2说明:第一艘船在第一秒到达海港,最近24小时到达的船是第1艘,共有4个乘客,分别是来自国家1,2,2,3,共来自3个不同的国家。


第2艘船是第3秒到达海港,最近24小时到达的船是第一艘船和第2艘船,共有4+2=6个乘客,分别来自1,2,2,3,2,3,共来自3个不同的国家


第3艘船是第86401秒到达海港,最近24小时到达的船是第2艘船和第3艘船,共有2+2=4个乘客,分别来自2.3,3,4,共来自3个不同的国家


第4艘船是第86402秒到达海港,最近24小时到达的船是第2艘船、第3艘船和第4艘船,共有2+2+1=5个乘客,分别来自2,3,3,4,5,共来自4个不同的国家。



代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
int a[100100];
int people[500100];
struct node
{
    int country;
    int time;
};
queue<node> q;
int main()
{
    int n, sum = 0;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
    {
        int t, p;
        scanf("%d%d", &t, &p);
        node temp;
        temp.time = t;
        for (int i = 1; i <= p; i++)
        {
            int cty;
            scanf("%d", &cty);
            temp.country = cty;
            q.push(temp);
            if (!people[cty])
                sum++;
            people[cty]++;
        }
        while (1)
        {
            node old;
            old = q.front();
            if (temp.time - 86400 >= old.time)
            {
                int tc = old.country;
        people[tc]--;
        if (!people[tc])
          sum--;
                q.pop();
            }
            else
                break;
        }
        cout << sum << endl;
    }
    return 0;
}


输入输出:

   3

   1 4 4 1 2 2

   3

   2 2 2 3

   4

   10 1 3

   4

   --------------------------------

   Process exited after 58.98 seconds with return value 0

   请按任意键继续. . .



目录
相关文章
|
8月前
|
Linux 监控 Ubuntu
Linux 终端操作命令(1)
Linux 终端操作命令(1)
111 1
Linux 终端操作命令(1)
|
8月前
|
算法 Java Go
Rust每日一练(Leetday0018) N皇后II、最大子数组和、螺旋矩阵
Rust每日一练(Leetday0018) N皇后II、最大子数组和、螺旋矩阵
62 1
Rust每日一练(Leetday0018) N皇后II、最大子数组和、螺旋矩阵
|
8月前
|
Linux 监控 Shell
Linux 终端命令之文件浏览(4) head, tail
Linux 终端命令之文件浏览(4) head, tail
76 0
Linux 终端命令之文件浏览(4) head, tail
|
8月前
|
Shell Linux 机器学习/深度学习
Linux 终端操作命令(3)内部命令用法
Linux 终端操作命令(3)内部命令用法
115 0
Linux 终端操作命令(3)内部命令用法
|
8月前
|
Python Linux Ubuntu
Linux系统部署Python语言开发运行环境
Linux系统部署Python语言开发运行环境
245 0
Linux系统部署Python语言开发运行环境
|
8月前
|
Go Unix 开发者
Go语言time库,时间和日期相关的操作方法
Go语言time库,时间和日期相关的操作方法
129 0
Go语言time库,时间和日期相关的操作方法
|
8月前
|
C++ 存储 Serverless
力扣C++|一题多解之数学题专场(2)
力扣C++|一题多解之数学题专场(2)
58 0
力扣C++|一题多解之数学题专场(2)
|
8月前
|
Go 机器学习/深度学习 Rust
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String
111 0
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String
|
8月前
|
Java Go C++
Golang每日一练(leetDay0115) 重新安排行程、递增的三元子序列
Golang每日一练(leetDay0115) 重新安排行程、递增的三元子序列
74 0
Golang每日一练(leetDay0115) 重新安排行程、递增的三元子序列
|
8月前
|
Java Go C++
Golang每日一练(leetDay0111) 摆动排序II\I Wiggle Sort
Golang每日一练(leetDay0111) 摆动排序II\I Wiggle Sort
65 0
Golang每日一练(leetDay0111) 摆动排序II\I Wiggle Sort