华为机试3——数字颠倒、删除字符串中出现次数最少的字符、提取不重复的整数、质数因子、合并表记录、求int型正整数在内存中存储时1的个数

目录

数字颠倒

删除字符串中出现次数最少的字符

提取不重复的整数

质数因子

合并表记录

求int型正整数在内存中存储时1的个数


数字颠倒

LeetCode刷多了连reverse是在algorithm中都忘记了……

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main(){
    string s;
    cin>>s;
    reverse(s.begin(),s.end());
    cout<<s<<endl;
    return 0;
}

删除字符串中出现次数最少的字符

全是体力活……记得有多个输入鸭

//
#include <iostream>
#include <string>
#include <map>
using namespace std;

int main(){
    
    map<char,int> m;
    string s;
    while(cin>>s){//有多个输入!题目没说
        for(int i=0;i<s.size();i++){
            m[s[i]]++;
        }
        //获得最小值
        int min = (1<<21);
        for(char x='a';x<='z';x++){
            if(m[x]<=min&&m[x]!=0)
                min = m[x];
        }
        string ss;
        string a;
        for(char x = 'a';x<='z';x++){
            if(m[x]==min)
                a.push_back(x);
        }
        bool flag = true;
        for(int i=0;i<s.size();i++){
            for(int j = 0;j<a.size();j++){
                if(a[j]==s[i])
                    flag = false;
            }
            if(flag)
                ss.push_back(s[i]);
            flag = true;
        }
        cout<<ss<<endl;
        m.clear();//记得清除
        s.clear();
    }

    return 0;
}

提取不重复的整数

思路最重要,不要急,慢慢想!

遇到问题先查一遍逻辑!

#include <iostream>
#include <vector>
#include <string>
#include <set>
#include <cstdlib>
using namespace std;

int main(){
    
    int a;
    cin>>a;
    if(a<10)
        cout<<a<<endl;
    else{
        string s = to_string(a);
        string ss;
        set<char> b;
        string v;
        b.insert(s[s.size()-1]);
        v.push_back(s[s.size()-1]);
        for(int i = s.size()-2;i>=0;i--){
            if(b.find(s[i])==b.end())//没找到
                v.push_back(s[i]);
            b.insert(s[i]);
        }
        int ans = atoi(v.c_str());
        cout<<ans<<endl;
    }

    return 0;
}

质数因子

这道题是我做到目前为止最有意思的一道题,其他的题都是体力活,这道很基础的数论真有意思!

想懂了很简单的,多体会

#include <iostream>
using namespace std;
int main(){
    long s;
    while(cin>>s)
        while(s!=1)//终止条件!
            for(int i=2;i<=s;i++)//此处能被自己整除的话,就肯定不是素数,所以不用额外判断是不是素数
                if(s%i==0){
                    cout<<i<<" ";//能整除输出
                    s/=i;
                    break;//break只跳出一重循环
                }
    return 0;
}

合并表记录

#include <iostream>
#include <map>
using namespace std;

int main(){
    int n;
    cin>>n;
    int key,value;
    map<int,int> m;
    for(int i=0;i<n;i++){
        cin>>key>>value;
        m[key]+=value;//map自动对第一个下标进行排序
    }
    for(map<int,int>::iterator it = m.begin();it!=m.end();it++)
        cout<<it->first<<" "<<it->second<<endl;//注意访问方法
    
    return 0;
}

求int型正整数在内存中存储时1的个数

应该是早年华为的放水题,牛客上有道差不多的题,但是有负数+大数情况,就棘手多了,负数要先转换成反码再+1转换成反码,要用位运算的技巧来A;

大数就更棘手,转换成数组?我暂时还没有简介的方法……

#include <iostream>
using namespace std;
int main(){
    int n;
    while(cin>>n){
        int num = 0;
        while(n!=0){
            num+=n%2;
            n/=2;
        }
        cout<<num<<endl;
    }
    return 0;
}
发布了377 篇原创文章 · 获赞 344 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/qq_41895747/article/details/104977842