华为机试题 1-10

字符串最后一个单词长度

#include<stdio.h>
#include<string.h>
const int maxn=5010;

int main(){
    char str[maxn];
    gets(str);
    int len=strlen(str);
    int num=0;
    for(int i=len;i>=0;i--){
        if(str[i]!=' '&& str[i]!='\0') num++;
        else if(str[i]=='\0') continue;
        else break;
    }
    printf("%d",num);
    return 0;
    
}
  • 代码必须在C环境下完成,c++环境不可以使用gets()
  • strlen()函数
  • gets()函数是C语言函数,用来接收输入的字符串,而scanf()可以接收多种格式的数据。两个函数遇到回车符都会认为是输入结束,但是gets()可以接收空格,但是scanf()则不行
  • getline()函数是C++的函数,使用该函数需要头文件iostream.h。默认情况下,该函数遇到回车停止读入,但是此时会屏蔽回车键。如下代码
    string str_input;
    getline(cin, str_input);
input_str = input().split(' ');
print(len(input_str[-1]))
  • str.split(str="", num=string.count(str)). split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串
  • len():用于测量变量当中的字符串/元组等的长度
  • str[-1]输出最后一个字符

计算某字符出现次数

#include<stdio.h>
#include<string.h>
int main(){
    char str[1010];
    gets(str);
    char a;
    scanf("%c",&a);
    int i=0,num=0;
    while(str[i]!='\0'){
        if(a>='a'&& a<='z'){
            if(str[i]==a||str[i]==a-32) num++;
        }
        else if(a>='A'&& a<='Z'){
            if(str[i]==a||str[i]==a+32) num++;
        }
        else{
            if(str[i]==a) num++;
        }
        i++;
    }
    printf("%d",num);
//    printf("%d",i);
    return 0;
}
  • ascII A65 a97 A+32==a
info = input().lower()
char = input().lower()
print(info.count(char))
  • lower() 方法转换字符串中所有大写字符为小写。

明明的随机数

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1010;
int main(){
    int n;
    int a[maxn];
    while(cin){
        cin>>n;
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
        }
        sort(a,a+n);
        for(int i=0;i<n;i++){
            if(a[i]!=a[i+1]&&a[i]!=0){
                cout<<a[i]<<endl;
            }
            a[i]=0;
        }
    }
    return 0;
}
  • 头文件 cin cout需要
  • 使用排序需要
  • 排序 Sort(start,end,cmp)

bool compare(int a,int b)
{
return a>b;
}

  • 本题重点:清空数组操作,避免上次数据产生影响
  • 输入不存在0,所以可以利用这一点

字符串分隔符

!!!万能头文件** #include<bits/stdc++.h> **

  • getline(cin, inputLine);
    此函数可读取整行,包括前导和嵌入的空格,并将其存储在字符串对象中。
#include<bits/stdc++.h>
using namespace std;
int main()
{
    string str1;
    while(getline(cin,str1)){
        while(str1.size()>8){
            cout<<str1.substr(0,8)<<endl;
            str1=str1.substr(8,str1.size()-8);
        }
        int len=str1.size();
        if(len==8){
            cout<<str1<<endl;
        }
        else if(len<8){
            for(int i=0;i<8;i++){
                if(i<str1.size()) cout<<str1[i];
                else cout<<"0";
            }
            cout<<endl;
        }
    }
    return 0;
}
  • str.substr(0,8)函数

进制转换

#include<bits/stdc++.h>
using namespace std;
int main(){
    string s;
    cin>>s;
    int len=s.size();
    int k=0.;
    int sum=0;
    for(int i=len-1;i>1;i--){
        int t;
        switch(s[i]){
            case '0':t=0;break;
            case '1':t=1;break;
            case '2':t=2;break;
            case '3':t=3;break;
            case '4':t=4;break;
            case '5':t=5;break;
            case '6':t=6;break;
            case '7':t=7;break;
            case '8':t=8;break;
            case '9':t=9;break;
            case 'A':t=10;break;
            case 'B':t=11;break;
            case 'C':t=12;break;
            case 'D':t=13;break;
            case 'E':t=14;break;
            case 'F':t=15;break;
        }
        sum+=t*pow(16,k);
        k++;
    }
    cout<<sum<<endl;
    return 0;
}
  • stoi()表示将字符串转换为整数 ,它是C ++ STL中的标准库函数,用于将各种格式(例如二进制,八进制,十六进制或字符串格式的简单数字)的给定字符串转换为整数。
  • stoi(字符串,起始位置,n进制)
    简单方法:
#include<iostream>
#include<string>
using namespace std;
  
int main(){
    string str;
    while(cin>>str){
        cout << stoi(str,0,16) << endl;
    }

质数因子

超时超时,我的思路是小于n的所有质数找到后从小到大尝试,但遇到太大的数的时候,不可行,无法通过全部用例

参考思路

  • 质数寻找时可以根据平方根下的寻找,sqrt(n)
  • 如果平方根之内的质数全都不能整除,即经过for循环后,n仍然等于旧的n,则可以判定n为质数,输出n
#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,old;
    cin>>n;
    int q=sqrt(n);
    while(n!=1){
        old=n;//必须在这里!
    for(int i=2;i<=q;i++){
        while(n%i==0){
            cout<<i<<' ';
            n=n/i;
        }
        if(old!=n)break;
    }
    if(old==n){
            cout<<n<<' ';
            break;
        }    
    }
    return 0;
}
  1. 从2开始,如果能整除则整除,不能整除则除3,一直除到该数,可保证除的一直是质数。因为如果是合数,例如4,早就在2的时候被除掉了。
  2. 如果只采用1的思路去除,时间复杂度是O(n),会超时,所以又采用了一条规律:例如200000014,他的因数一定最多只有一个大于根号200000014,因此从0到根号这个数除尽后,只会剩一个大质数,直接输出这个大质数即可,此时时间复杂度降到O(n^(1/2))。

四舍五入

  • Floor() 不大于自变量的最大整数
  • Ceil() 不小于自变量的最大整数
  • Round() 四舍五入到最邻近的整数

好聪明想法:

#include <stdio.h>
int main(void)
{
    double num;
    scanf("%lf",&num);
    printf("%d",(int)(num + 0.5));
    return 0;
}

合并表记录

!sort函数关于结构体的排序
改写cmp函数

bool cmp(table a,table b){
    return a.index<b.index;
}

提取不重复的整数

  • memset(k,-1,sizeof(k));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值