2019腾讯的面试题
1. 删除字符串s1 中在字符串s2 中出现的字符。
基本思路:把s1的字符存到一个set里面,然后遍历s2,看是否出现过,出现过就erase掉。但是直接输出set的元素这样会改变顺序,要想顺序不变,就顺序遍历一下s1 看是否出现,出现就输出。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <set>
#include <queue>
#include <map>
using namespace std;
typedef long long LL;
const int maxn=1005;
set<char>s;
int main()
{
string s1,s2;
cin>>s1>>s2;
int len=s1.length();
for(int i=0;i<len;i++)
s.insert(s1[i]);
len=s2.length();
for(int i=0;i<len;i++)
{
if(s.count(s2[i]))
s.erase(s.find(s2[i]));
}
len=s1.length();
for(int i=0;i<len;i++)
{
if(s.count(s1[i]))
cout<<s1[i];
}
cout<<endl;
return 0;
}
2. 有序链表合并
LeetCode原题:递归解决,终止条件:l1为空或者l2位空(同时为空已经在l1那里判断了)
l1的值比较小或者两个值相等,就把l1->next和l2合并,放进l1->next,返回l1;
l2的值比较小,就把l1和l2->next合并,放进l2->next,返回l2;
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (l1 == NULL) {
return l2;
}
else if (l2 == NULL) {
return l1;
}
else {
if (l1->val <= l2->val) {
l1->next = mergeTwoLists(l1->next, l2);
return l1;
}
else {
l2->next = mergeTwoLists(l1, l2->next);
return l2;
}
}
}
};
3. 二叉树中和为某一值的路径、
剑指Offer 题,从树的根节点开始一直到叶子结点所经过的结点形成一条路径也就是说每条满足条件的路径都是以根节点开始,叶子结点结束,如果想得到所有根节点到叶子结点的路径(不一一定满足和为某整数的条件),需要遍历整棵树,还要先遍历根节点,所以采用先序遍历。在这个过程中判断路径和,每访问一个节点,我们都把当前节点保存到路径中。而且每次当从子节点回到父节点的时候,我们都需要在路径上删除子节点。
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
find(root,expectNumber);
return res;
}
void find(TreeNode* root,int sum){
if(root == NULL){
return;
}
path.push_back(root->val);
if(!root->left && !root->right && sum == root->val){
res.push_back(path);
}
else{
if(root->left){
find(root->left,sum - root->val);
}
if(root->right){
find(root->right,sum - root->val);
}
}
path.pop_back();
}
};
4. 给定整数数组a,O(n)时间求a[i] & a[j] 最大值
暂时没啥思路。