牛客网华为机试笔记【1~10】

1.计算字符串最后一个单词的长度,单词以空格隔开。

【思路一】:倒着结算,从结束符开始,到下一个空格为止,就是最后一个单词的长度,但要考虑以空格为结尾的特殊情况

#include <iostream>
#include <string>

using namespace std;
int main()
{
  string s;
  while(getline(cin,s))
  {
      int count =0;
      bool flag =true;
      for(int i = s.length()-1;i>=0;--i)
      {
          if(flag&&s[i]==' ')
          {
              continue;
          }
          else if(s[i]!=' ')
          {
              flag = false;
              count++;
          }
          else
          {
              break;
          }
      }
      cout <<count<<endl;
  }
}

【思路二】:利用cin函数的特性,遇见空格结束,会记录最后一个单词

 

#include<iostream>

#include<string>

using namespace std;

int main(){

    string str;

    while(cin>>str);

    cout<<str.size()<<endl;

    return 0;

}

2.写出一个程序,接受一个由字母和数字组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。

【思路一】:转换大小写后,循环遍历挨个字符比较

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s;
    char c;
    cin>>s;
    cin>>c;
    int count =0;
    for(int i=0;i<s.length()-1;i++)
    {
        if(toupper(s[i])==toupper(c))
        {
            count++;
        }
    }
    cout <<count<<endl;
}

 【思路二】:用STL标准模板库中算法count函数,还是需要先转换大小写

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s;
    char c;
    cin >> s;
    cin >> c;
    _strupr_s(((char *)s.c_str()),s.length()+1);
    c = toupper(c);
    cout << (count(s.begin(), s.end(), c)) << endl;
}

3.明明的随机数

【思路一】:利用STL中的容器和算法,一种是vector排序加unique去重,另一种直接用set容器去重

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

int main()
{
    int N = 0;
    while(cin>>N)
    {
        vector<int> array;
        while(N>0)
        {
            int tempNumber = 0;
            cin>>tempNumber;
            array.push_back(tempNumber);
            N--;
        }

        sort(array.begin(),array.end());
        vector<int>::iterator iter;
        iter = unique(array.begin(),array.end());
        if(iter!=array.end())
        {
            array.erase(iter,array.end());
        }
        for(iter=array.begin();iter!=array.end();iter++)
        {
            cout<<*iter<<endl;
        }
    }

//set集合的方法

#include<iostream>

#include<set>

 

using namespace std;

 

int main(){

    int loop = 0;

    while (cin >> loop)                   //看题目,set容器

    {

        int a[1000], tem, i = 0;

        for (int i = 0; i < loop; i++) cin >> a[i];

        set<int> num(a, a + loop);

        for (set<int>::iterator it = num.begin(); it != num.end(); it++){

            cout << *it << endl;

        }

    }

    return 0;

}

 【思路二】:用桶排序的思想,为每个不重复的元素建立一个桶,然后按顺序输出

 

#include <iostream>

using namespace std;

int main() {

    int N, n;

    while (cin >> N) {

        int a[1001] = { 0 };

        while (N--) {

            cin >> n;

            a[n] = 1;

        }

        for (int i = 0; i < 1001; i++)

            if (a[i])

                cout << i << endl;

    }

    return 0;

}

4.字符串分割

【思路一】:先把字符串补齐为8的倍数,再每8个输出一次

 

#include <iostream>
#include <string>
using namespace std;
void dealString(string &s)
{
    if(!s.empty())
    {
        if(s.length()%8)
        {
            s.append(8-s.length()%8,'0');
        }
        while(s.length()>=8)
        {
            cout<<s.substr(0,8)<<endl;
            s=s.substr(8);
        }
    }
}

int main()
{
    string str1,str2;
    cin>>str1>>str2;
    dealString(str1);
    dealString(str2); 
}

【思路二】:递归流(下面是某位大神的代码,函数名的风格别具一格,仅供参考)

 

#include <iostream>

#include <string>

using namespace std;

void ***(string str) {

    if (str == "")

        return;

    if (str.size() <= 8) {

        str.append(8 - str.size(), '0');

        cout << str << endl;

        return;

    }

    cout << str.substr(0, 8) << endl;

    ***(str.substr(8, str.size()));

}

int main() {

    string str1, str2;

    cin >> str1 >> str2;

    ***(str1);

    ***(str2);

    return 0;

}

5.进制转化

【思路】:用C语言的格式转换,或者C++字符流转换

 

#include <stdio.h>

int main(){

    int a;

    while (scanf("%x", &a) != EOF){

        printf("%d\n", a);

    }

    return 0;

}

 #include <iostream>
using namespace std;
int main()
{
    int a;
    while(cin>>hex>>a)
    {
        cout <<a<<endl;
    }
}

 6.质数因子

#include <iostream>
#include <string>
using namespace std;
int main()
{
    long a;
    while(cin>>a)
    {
        int divisor = 2;
        if(a ==1)
        {
            cout <<"1"<<endl;
        }
        while(a!=1)
        {
            if(a%divisor==0)
            {
                a=a/divisor;
                cout <<divisor<<" ";
            }
            else
            {
                ++divisor;
            }
        }
    }
}

7.取近似值

#include <math.h>
using namespace std;
int main()
{
    float a;
    cin>>a;
    //方法一
    //cout <<int(a+0.5)<<endl;
    //方法二
    //cout<<round(a)<<endl;
    //方法三
    int tmp = int(a);
    if(a-tmp>=0.5)
    {
        cout <<tmp+1<<endl;
    }
    else
    {
        cout <<tmp<<endl;
    }

 8.合并表记录

【思路】:键值对,很容易想到C++STL里的关联容器map;如果自己写的话,需要先定义类似pair这样的数据结构

#include <iostream>
#include <map>
using namespace std;
int main()
{
    map<int,int> dataTable;
    int key=0,value=0,N=0;
    cin>>N;
    while(N--&&cin>>key>>value)
    {
        dataTable[key]+=value;
    }
    for(map<int,int>::iterator iter=dataTable.begin();iter!=dataTable.end();iter++)
    {
        cout <<iter->first<<" "<<iter->second<<endl;
    }
}

9.提取不重复的数

【思路一】:主要去重后还要保持顺序一致性,这里先求余得到逆序,然后建立10个标记,如果存在标记,则跳过重复数字输出

#include <iostream>
using namespace std;
int main()
{
    int a;
    while(cin>>a)
    {
        int array[10]={0};
        while(a)
        {
            if(array[a%10]==0)
            {
                array[a%10]++;
                cout<<a%10;
            }
            a=a/10;
        }
        cout<<endl;
    }
    return 0;

【思路二】:当作字符串处理,用find函数 发现重复则跳过输出

 

#include<iostream>

using namespace std;

int main()

{

    string str;

    string str1="";

    cin>>str;

    for(int i=str.length()-1;i>=0;i--)

    {

        if(str1.find(str[i])==string::npos)

            str1+=str[i];

    }

    cout<<str1<<endl;

    return 0;

}

10.字符个数统计

【思路一】:建一个标记数组,最后统计(适用于统计范围不大情况)

#include <iostream>
using namespace std;
int main()
{
    int array[128]={0};
    int result=0;
    char c;
    while(cin>>c)
    {
        array[c]=1;
    }
    for(int i=0;i<128;++i)
    {
        if(array[i])
        {
            result++;
        }
    }
    cout<<result<<endl;

【思路二】:使用STL中set集合去重,输出set尺寸即可 

 

#include<iostream>

#include<set>

using namespace std;

int main()

{

    char c;

    set<char> s;

    while(cin>>c){

        if(c>=0 && c<=127){

            s.insert(c);

        }

    }

    cout << s.size() <<endl;

}

根据引用,牛客网华为机试题解的JavaScript版本提供了第11到20题的解答。其中包括了数字颠倒、字符串反转、句子逆序、字符串排序、求int型数据在内存中存储时1的个数、购物单、坐标移动、识别有效的IP地址和掩码并进行分类统计、简单错误记录和密码验证格程序。 根据引用,题目描述了如何将输入的整数以字符串的形式逆序输出。程序不考虑负数的情况,如果数字中包含0,逆序形式也会包含0。 根据引用,题目描述了如何计算输入的正整数在内存中存储时1的个数。题目要求输入一个整数(int类型),并将该数转换成二进制形式后输出其中1的个数。 需要注意的是,输入和输出的具体实现可能因题目而异,以上引用提供了一些示例代码,但并不代表所有题目的通用解法。正确的输入输出取决于具体题目的要求和所给代码的实现方式。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [JavsScript牛客网华为机试(11-20)题解](https://blog.csdn.net/weixin_43465339/article/details/110709521)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值