华为笔试 c++ AC 2.6 代码

字符串拆分 ac

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin >> n;
    vector<string> strs(n);
    for(int i = 0 ;i < n;i++)
    {
        cin >> strs[i];
    }
    multiset<string> ans;
    for(int i = 0;i < n;i++)
    {
        int nowSize = strs[i].size();
        //需要拆分
        if(nowSize > 8){
            int index = 0;
            while(nowSize > 8)
            {
                string now = strs[i].substr(index, 8);
                ans.insert(now);
                index += 8;
                nowSize -= 8;
            }
            string zero = "";
            for(int j = 0;j < 8 - nowSize;j++){
                zero += "0";
            }
            string now = strs[i].substr(index,nowSize);
            ans.insert(now + zero);
        }
        else{
            string zero = "";
            string now = strs[i].substr(0,nowSize);
            for(int j = 0;j < 8 - nowSize;j++){
                zero += "0";
            }
            ans.insert(now + zero);
        }

    }
    for(auto it = ans.begin(); it != ans.end();it++)
        cout << *it <<  " ";
    return 0;
}

字符串括号 ac

LeetCode 394 原题改编

#include<bits/stdc++.h>
using namespace std;
string decodeString(string s) {
        string res = "", t = "";
        stack<int> s_num;
        stack<string> s_str;
        int cnt = 0;
        for (int i = 0; i < s.size(); ++i) {
            if (s[i] >= '0' && s[i] <= '9') {
                cnt = 10 * cnt + s[i] - '0';
            } else if (s[i] == '(' || s[i] == '[' || s[i] == '{') {
                s_num.push(cnt);
                s_str.push(t);
                cnt = 0; t.clear();
            } else if (s[i] == ')' || s[i] == ']' || s[i] == '}') {
                int k = s_num.top(); s_num.pop();
                for (int j = 0; j < k; ++j) s_str.top() += t;
                t = s_str.top(); s_str.pop();
            } else {
                t += s[i];
            }
        }
        return s_str.empty() ? t : s_str.top();
}

int main()
{
    string str;
    cin >> str;
    str = decodeString(str);
    for(int i = str.size() - 1;i >= 0;i--)
        cout << str[i];
    cout << endl;
}

海拔 63%样例

dfs遍历,注意边界条件。

#include<bits/stdc++.h>
using namespace std;
long long maxnum = 1e9;
void DFS(vector<vector<long long> > &grid, vector<vector<bool> > &visited, int x, int y, int z, int w, int& ans) {
    if (x < 0 || x >= grid.size()) return;
    if (y < 0 || y >= grid[0].size()) return;
    if(x == z && y == w){
        ans++;
        return;
    }
    int now = grid[x][y];
    if (visited[x][y]) return;

    visited[x][y] = true;
    if(x - 1 >=0 && grid[x - 1][y] > now )DFS(grid, visited, x - 1, y, z, w, ans);
    if(x + 1 < grid.size() && grid[x + 1][y] > now )DFS(grid, visited, x + 1, y, z, w, ans);
    if(y - 1 >= 0 && grid[x][y - 1] > now )DFS(grid, visited, x, y - 1, z, w, ans);
    if(y + 1 <= grid[0].size() && grid[x][y + 1] > now )DFS(grid, visited, x, y + 1, z, w, ans);
    visited[x][y] = false;
}
int main()
{
    int n,m;
    cin >> n >> m;
    vector< vector<long long> > g(n, vector<long long>(m, 0));
    vector<vector<bool> > visited(n, vector<bool>(m, false));

    for(int i = 0;i < n;i++){
        for(int j = 0; j < m;j++)
            cin >> g[i][j];
    }
    int x,y,z,w;
    cin >> x >> y >> z >> w;
    int ans = 0;
    DFS(g, visited, x, y, z, w, ans);
    ans = ans%maxnum;
    cout << ans << endl;
    return 0;
}

有没有第三题ac的大佬啊,dfs时间复杂度太高了。

#笔试题目##华为#
全部评论
为什么 x-1 和 y-1 的时候不用判断 是否访问过呀
点赞 回复 分享
发布于 2019-04-10 21:20
第二题尴尬了,以为像数***算那样。。没想到(]这样也能匹配
点赞 回复 分享
发布于 2019-04-10 21:26
应该不visit判断的,能向下走的肯定回不去的
点赞 回复 分享
发布于 2019-04-10 21:42
第一题为啥sort排序以后,只能通过百分之八十,第一题排序逻辑是什么啊,感觉没怎么懂你代码的排序逻辑
点赞 回复 分享
发布于 2019-04-10 21:55
突然发现忘记判断if(used[i][j]),还好第三题少了这个判断没影响😂
点赞 回复 分享
发布于 2019-04-10 22:54
#include<iostream> #include<string> #include<vector> #include<algorithm> using namespace std; bool cmp(const string &s1, const string& s2) {     return s1<s2; } int main() {     vector<string> vs;     string str;     string str1;     vector<string> vso;     int n = 0;     while (cin >> n)     {         if (cin.get() == ' ')             break;     }     while (cin >> str)     {         vs.push_back(str);         if (cin.get() == '\n')             break;     }     for (int i = 0; i<vs.size(); i++)     {         int len = vs[i].length();         if (len % 8 != 0)         {             vs[i].resize(len + 8 - len % 8, '0');             for(int j = 0; j<vs[i].length() / 8; j++)             {                 str1= vs[i].substr(j * 8, 8);                 vso.push_back(str1);             }         }         else if (len == 0)         {             i++;          }         else         {             for (int k = 0; k<vs[i].length() / 8; k++)             {                 str1 = vs[i].substr(k * 8, 8);                 vso.push_back(str1);             }         }     }     sort(vso.begin(), vso.end(), cmp);     for (int m = 0; m<vso.size(); m++)     {         cout << vso[m]<< " ";     }     return 0; } c++渣渣:笔试一直通不过,考完本地测试,不知正确与否
点赞 回复 分享
发布于 2019-04-10 23:09
第三题加个带记忆才能过 不然时间复杂度太大
点赞 回复 分享
发布于 2019-04-11 08:38
真叼 看都看不懂
点赞 回复 分享
发布于 2019-04-11 09:27
。。。老哥第二题我也是做过leetcode原题 学的估计也是同一个博客 代码和你写的差不多 不会判咱俩作弊吧😅
点赞 回复 分享
发布于 2019-04-11 14:01

相关推荐

gcniz:一天写两千行你闹呢
点赞 评论 收藏
分享
点赞 37 评论
分享
牛客网
牛客企业服务