首页 > 2020/09/01 阿里笔试附解题思路代码
头像
Ucspouch
编辑于 2020-09-02 11:00
+ 关注

2020/09/01 阿里笔试附解题思路代码


第一题

  • 给定两个字符串 S, T  要求返回满足以下两个条件的子串
  • 1. 子串为 S 的子串例如 a, ac 是 acd 的子串
  • 2. 子串的序列为 T的子序列 例如 ac 为 abcd 的子序列

解法为:
先得到 s 的 子串 a, b, c, ab, bc, abc
但其实只需要 保留 abc, bc, c 即可, 因为 abc中已经包含 a, ab, abc ; bc 包含 b, bc
用 T字符串分别跟 abc, bc, c 比对, 在比对完 abc之后其实我们已经累加 得到了 a, ab, abc的答案
复杂度为 O(n) + O(nm)
vector<string> list;
for (int i = 0; i < n - 1; i++) {
    list.push_back(S.substr(i));
}
int res = 0;
int start = 0

for (int i = 0; i < list.size(); i++) {
    int start = 0;
    for (int j = 0; j < T.length && start < list[i].length; j++) {
        if (list[i][start] == T[j]) {
            res++;
            start++;
        }
    }
} 



第二题

  • 给定 字节长度为m  的  n 组 字节流 和 确认正确的字符数目, 求能否还原正确的字符流, 若能且答案唯一请输出该答案, 若有多个答案输出答案的总数, 若无答案输出 0
  • 例子 :  5
  • 00101 4
  • 00111 3
  • 10011 3
  • 答案唯一为  10101     (不记得是不是这样了, 大概这个题意吧, 不纠结)

解法为: 回溯法, 总共 是 2^m种组合可能 那么就用回溯法来做
有不对的地方请大家指出来
int dfs (vector<int>& path, int i, int m, vector<vector<int>>& streams, int[] correct, vector<int> res) {
    if (i == m) {
        bool allZero = true;
        for (int j = 0; j < correct.length; j++) {
            if (correct[j] != 0) {
                allZero = false;
                break;
            }
        }
        if (allZero) {
            vector<int>v (path);
            res.swap(v);
            return 1;
        }
        return 0;
    }
    int res = 0;
    int temp[m];
    path.push_back(1);
        for (int j = 0; j < correct.length; j++) {
            temp[j] = streams[j][i] == 1 ? correct[j] - 1 : correct[j];
        }
        res += dfs(path, i + 1, m, streams, temp);
    path.pop_back();
    path.push_back(0);
        for (int j = 0; j < correct.length; j++) {
            temp[j] = streams[j][i] == 0 ? correct[j] - 1 : correct[j];
        }
        res += dfs(path, i + 1, m, streams, temp);
    path.pop_back();
    return res;
}





全部评论

(1) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

近期热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐