1. 电话号码的字母组合
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例 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:

输入: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说明:第一艘船在第一秒到达海港,最近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
样例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
? ?请按任意键继续. . .