华为2018校招技术岗笔试

输入一个整数(含负数),输出3个数据,如下:
1.输出该整数的位数;
2.将该整数各位拆分输出,中间以空格隔开(注意末位不能有空格)。如果是负数,则符号与第一个数一起输出;
3.输出该数的反转数,如为负数,符号位置不变,置于最前。

示例
输入:

-12345

输出: 

5
-1 2 3 4 5
-54321
#include <iostream>
#include <cmath>
#include <algorithm>
#include <set>
#include <cstdio>
#include <string>
#include <cstring>
/*@author:浅滩
*family:
*time:
*/
//我好像是一个在海边玩耍的孩子,
//不时为拾到比通常更光滑的石子或更美丽的贝壳而欢欣鼓舞,
//而展现在我面前的是完全未探明的真理之海
using namespace std;

int main()
{

    string s_num;
    int i;
    getline(cin,s_num);
    if(s_num[0]=='-')//负数
    {
        cout<<s_num.size()-1<<endl;
        cout<<"-"<<s_num[1]<<" ";
        for(i=2;i<s_num.size();i++){
            cout<<s_num[i]<<(i==s_num.size()-1? "
":" ");
        }
        cout<<"-";
        for(int i=s_num.size()-1;i>=1;i--){
            cout<<s_num[i];
        }


    }
    else{
       cout<<s_num.size()<<endl;
        for(i=0;i<s_num.size();i++){
            cout<<s_num[i]<<(i==s_num.size()-1? "
":" ");
        }

        for(i=s_num.size()-1;i>=0;i--){
            cout<<s_num[i];
        }


    }



    //cout << "Hello world!" << endl;
    return 0;
}
 

 

题目:

输入4个IP值组成两个IP段:
第一、二行分别为第一个IP段的起始和结尾IP,第三、四行为第二个IP段的起始和结尾。
要求输出:
若两个IP段有交集则输出"Overlap IP",没有则输出"No Overlap IP"。

示例
输入:

1.1.1.1
255.255.255.255
2.2.2.2
3.3.3.3

输出:

Overlap IP

通过从字符串中提取ip的四位数进行比较,只有两种情况没有交集

代码如下:

#include <iostream>
#include <cmath>
#include <algorithm>
#include <set>
#include <cstdio>
#include <string>
#include <cstring>
/*@author:浅滩
*family:
*time:
*/
//我好像是一个在海边玩耍的孩子,
//不时为拾到比通常更光滑的石子或更美丽的贝壳而欢欣鼓舞,
//而展现在我面前的是完全未探明的真理之海
using namespace std;


void get_num(string& a,int *b)//提取ip的四位数字
{//这里和blibli的version版本的那道题目是相似的
int s=0;
int top=0;

        for(int i=0;i<a.size();i++)
        {
            if(a[i]!='.')
            {
            s=s*10+(a[i]-'0');
            }
            if(a[i]=='.'||i==a.size()-1)
            {
                b[top]=s;
                s=0;
                top++;
            }

        }
}
int judge(int *a,int *b)//比较ip的大小
{

 for(int i=0;i<4;i++){
    if(a[i]>b[i]) {//ipa>ipb
        return 1;
    }
    else if(a[i]<b[i]){//ipa<ipb
        return 2;
    }
 }return 3;//ipa==ipb

}
int main()
{

    string ip0_sta,ip0_end,ip_sta,ip_end;
    int     p0_s[4],p0_e[4],p_s[4],p_e[4];//提保存p的四位数字
    cin>>ip0_sta>>ip0_end>>ip_sta>>ip_end;
    get_num(ip0_sta,p0_s);
    get_num(ip0_end,p0_e);
    get_num(ip_sta,p_s);
    get_num(ip_end,p_e);
    //没找到交际只有两种情况
    //1、ip0的终点小于ip的起点
    //2、ip的终点小于ip0的起点
    if(judge(p0_e,p_s)==2){
      
        cout<<"No Overlap IP"<<endl;
        return 0;
    }
    if(judge(p_e,p0_s)==2){
      cout<<"No Overlap IP"<<endl;
    return 0;
    }
    cout<<"Overlap IP"<<endl;



    return 0;
}
因为ip的小数点是3个确定的所以可以直接利用scanf的指定方式输入,省去了读入字符串然后从字符串中提取数字的步骤
#include <iostream>
#include <cmath>
#include <algorithm>
#include <set>
#include <cstdio>
#include <string>
#include <cstring>
/*@author:浅滩
*family:
*time:
*/
//我好像是一个在海边玩耍的孩子,
//不时为拾到比通常更光滑的石子或更美丽的贝壳而欢欣鼓舞,
//而展现在我面前的是完全未探明的真理之海
using namespace std;
 

int judge(int *a,int *b)//比较ip的大小
{
 
 for(int i=0;i<4;i++){
    if(a[i]>b[i]) {//ipa>ipb
        return 1;
    }
    else if(a[i]<b[i]){//ipa<ipb
        return 2;
    }
 }return 3;//ipa==ipb
 
}
int main()
{
    int   p0_s[4],p0_e[4],p_s[4],p_e[4];//提保存ip的四位数字
    //cin>>ip0_sta>>ip0_end>>ip_sta>>ip_end; 
    scanf("%d.%d.%d.%d",&p0_s[0],&p0_s[1],&p0_s[2],&p0_s[3]);                                                        
    scanf("%d.%d.%d.%d",&p0_e[0],&p0_e[1],&p0_e[2],&p0_e[3]);
    scanf("%d.%d.%d.%d",&p_s[0],&p_s[1],&p_s[2],&p_s[3]);
    scanf("%d.%d.%d.%d",&p_e[0],&p_e[1],&p_e[2],&p_e[3]);    
    

    //没找到交际只有两种情况
    //1、ip0的终点小于ip的起点
    //2、ip的终点小于ip0的起点
    if(judge(p0_e,p_s)==2){
       
        cout<<"No Overlap IP"<<endl;
        return 0;
    }
    if(judge(p_e,p0_s)==2){
      cout<<"No Overlap IP"<<endl;
    return 0;
    }
    cout<<"Overlap IP"<<endl;
 

    return 0;
}

  


输入两行数据,第一行包含多个正整数,以空格分开,根据每个数的后三位大小进行排序;第二行为数值n,输出排序后指定位置n的数。 要求: 1.若数不足三位,则直接比较; 2.若两数比较结果相等,则两数相对位置不变。 要求输出: 排序后第n个数(位置从1开始)


示例
输入:

12 450 9001 5231 8231 7231
5

输出:

7231

#include <iostream>
#include <cmath>
#include <algorithm>
#include <set>
#include <cstdio>
#include <string>
#include <cstring>
/*@author:浅滩
*family:
*time:
*/
//我好像是一个在海边玩耍的孩子,
//不时为拾到比通常更光滑的石子或更美丽的贝壳而欢欣鼓舞,
//而展现在我面前的是完全未探明的真理之海
using namespace std;
const int maxn=3000+5;
void mysort(int *a,int n)//不能用sort是因为sort是不稳定排序
{

  for(int i=0;i<n-1;i++)
  {

      for(int j=0;j<n-1-i;j++)
      {

          if((a[j]%10+(a[j]/10%10)*10+(a[j]/100%10)*100)>(a[j+1]%10+(a[j+1]/10%10)*10+(a[j+1]/100%10)*100)) swap(a[j],a[j+1]);
      }

  }


}
int main()
{


    string num[maxn];
    int i=0,n;
    while(cin>>num[i]){
        i++;
    }

    cin>>n;
    int p[i];
    for(int j=0;j<i;j++){
        p[j]=stoi(num[j]);//必须是c++11以上
    }
    mysort(p,i);
    cout<<p[n-1]<<endl;

    //cout << "Hello world!" << endl;
    return 0;
} 
不一样的烟火
原文地址:https://www.cnblogs.com/cstdio1/p/11111120.html