华为第二题 AC C++

/*
   算法思想:1.如果num[i]<=num[i+1],如果count[num[i]]>1,则删除num[i],否则不删除。
             2.数字的最大值总是保留第一个出现的位置,其他则删除。
     4 2 3 2 4
   首先删除的非最大值:
     ..... 得到:4 3 2 4
   然后处理最大数字值,保留第一个出现的:
     ..... 得到:4 3 2
*******************************************************************************************************
   答案有问题。。请看评论。。测试用例少,所以AC了。有同学,直接set得到不同的数字,然后大到小输出60%。
   谢谢各位的指正,给出的case。
*/
#include<iostream>
#include<climits>
#include<cstring>
#include<string>
using namespace std;

int main(){
   string str;
   while(getline(cin,str)){
    if(str.length()<=1) {cout<<str<<endl; continue;}
   

    /*num_count 计数数组 */
    int num_count[10]={0};
        /* 最大值位置 */
    int max_val=INT_MIN;int max_pos=-1;
    for(int i=0;i<str.length();i++){
        int tmp=str[i]-'0';
        num_count[tmp]++;
        if(tmp>max_val) {max_val=tmp;max_pos=i;}
    }

     /*删除的位置,标志位*/
    int *to_delete=new int[str.length()];
    memset(to_delete,0,sizeof(int)*str.length());


     for(int i=1;i<str.length();i++){
        int tmp=str[i-1]-'0';
        if(str[i]>=str[i-1]&&num_count[tmp]>1){
            num_count[tmp]-=1;
            to_delete[i-1]=-1;
        }
     }
     
     string result;
     for(int i=0;i<str.length();i++){
        if(i==max_pos) result=result+str[i];
        if(to_delete[i]!=-1&&(str[i]-'0'!=max_val)) result=result+str[i];
        
     }
    cout<<result<<endl;
   }
   return 0;
}



全部评论
423234.保留第一个不是423么,结果不应该是432么
点赞 回复 分享
发布于 2017-08-23 23:29
。。。虽然华为不让我笔试。。不过你的程序好像根本不对吧。。。。 你输入432143214321试试。。。。 #include <iostream> #include <vector> #include <string> #include <algorithm> using namespace std; int main() { string str; while (cin >> str) { int len = str.length(); vector<int>count(10,0); for (int i = 0; i < len; i++) { count[str[i] - '0']++; } for (int i = 0; i < str.length()-1; i++) { if (str[i] <= str[i + 1] && count[str[i] - '0'] > 1) { count[str[i] - '0']--; str.erase(i, 1); i--; } } for (int i = str.length() - 1; i >=0; i--) { if (count[str[i] - '0'] > 1) { count[str[i] - '0']--; str.erase(i, 1); } } cout << str << endl; } return 0; } 这是我的。。。仅供参考。。。
点赞 回复 分享
发布于 2017-08-24 00:27
这题测试用例不全,楼主你用1232153试试,你的方法是32153,而正确应为3215
点赞 回复 分享
发布于 2017-08-24 00:30
贪心去做 #include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { ll n, tmp; vector<int> cnt(10); vector<int> s; vector<int> vis(10); cin >> n; tmp = n; while(tmp > 0) { cnt[tmp%10]++; s.push_back(tmp%10); tmp /= 10; } reverse(s.begin(), s.end()); stack<int> st; for (int i = 0; i < s.size(); ++i) { //cout << s[i] << endl; cnt[s[i]]--; if (st.empty()) { st.push(s[i]); vis[s[i]] = 1; } else { while(!st.empty() && st.top() < s[i] && cnt[st.top()] && !vis[s[i]]) { vis[st.top()] = 0; st.pop(); } if (!vis[s[i]]) st.push(s[i]), vis[s[i]] = 1; } } ll ans = 0, T = 1; while (!st.empty()) { ll x = st.top();st.pop(); ans += x*T; T *= 10; } cout << ans << endl; return 0; }
点赞 回复 分享
发布于 2017-08-24 08:07
#include <iostream> #include <string> using namespace std; bool search(string s, char a) { for (int i = 0; i < s.size(); i++) if (s[i] == a) return true; return false; } int main() { string s; while (cin>>s) { for (char i = '9'; i >= '0'; i--) { int j = 0; bool b = false; while (1) { if (s[j] == i) { if (b) { s.erase(j,1); j--; } else { if (s[j] < s[j + 1] && search(s.substr(j+1),i)) { s.erase(j,1); j--; } else b = true; } } j++; if (j >= (s.length() - 1)) { if (b&&s[j]==i) s.erase(j,1); break; } } } cout << s << endl; } }
点赞 回复 分享
发布于 2017-08-24 14:18

相关推荐

牛舌:如果我不想去,不管对方给了多少,我一般都会说你们给得太低了。这样他们就会给下一个offer的人更高的薪资了。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务