C++ 华为机试练习题(一)

1.

char*与char[]区别:

char* s1=”abc”;s1是一个指针,s1所指向的地址的内容是不可改变的,但是s1可以指向其他地址。s1是指向字符串常量的,它存储在里不可被修改

char* s1="abcd";
s1[2]='z';    //错误:编译时能通过运行的时候会报错
s1="xyz";     //可以将指针指向其他内容
cout<<s1[2]<<endl;

char s2[] =”cdef”;是一个数组,s2指向第一个元素所在的位置,一经分配就不能更改。 它的空间是则栈里分配的,可以被重新修改,但是s2不能够再指向其他空间

char s2[]="efgh";
s2="xyz";        //出错:s2不可以再指向其他内容
cout<<s2[2]<<endl;  // s2中的元素是可以被修改的

若是将指针指向一个数组,那么这个数组即可以被改变元素值又可以被指向其他字符串

char *p=s2;
p[0]='x';   //可以改变元素值
p="rty";    //可以指向其他字符串
cout<<p;

char *与char a[] 的本质区别:

1)当定义char a[10]时,编译器会给数组分配十个单元,每个单元的数据类型为字符,sizeof(a) = 10

2)而定义char *s 时,这是给指针变量,只占四个字节,32位,用来保存一个地址。sizeof(s) = 4

printf("%p", s); // 这个表示s的单元中所保存的地址
 
printf("%p", &s);  // 这个表示变量本身所在内存单元地址,不要搞混了

注:

(1).

char *s1:s1是一个指向字符串的指针;
char s2[]:s2是一个字符数组;
string s3:s3是一个string类的对象.

(2).

string和CString是类,有特定的构造函数和一些方法方便你操作字符串。而char是一种度原始数据类型,可以是一个字符也可回以是字符数组像char[] 、char*,它不是类,所以只能借助现成的libc中的函数来操作它,比如strcpy strcmp strlen等。

  (3).

char (*s)[i]与char *s[i]区别:

char (*s)[i]; //s是个指针,它指向长度是i的一维数组,可以用第二维长度是i的二维数组的地址初始化它;
char *s[i]; //s是个数组,它的元素是指向字符类型的指针char* .

 (4). 取char a[20] ,char *s ,当s=a ,则s[i] == a[i]

 

例:

#include<iostream>
using namespace std;

int count_last(char* str)
{
    int count = 0;
    if(str == NULL)
        return 0;
    int i = 0;
    while(str[i] != '\0') // \0是组的结束字符标志
        i++;
    int length = i;
    while(str[i-1] != ' ' && (i >= 1)) //从尾向前
        i--;
    count = length - i;
    
    return count;
}

int main()
{
    char str[5000];
    int count = 0;
    cin.getline(str, 5000);
    count = count_last(str);
    cout << count;
    
    return 0;
}

2.

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

int Chazhao(string str, char ch)
{
    int N = 0;
    if(ch >= 'A' && ch <= 'Z')
        ch = ch +32;
    for(int i = 0; i < str.length(); i++)
    {
        if(str[i] >= 'A' && str[i] <= 'Z')
            str[i] = str[i] + 32;
        if(str[i] == ch)
            N++;
        else
            continue;
    }
    
    return N;
}

int main()
{
    string ip;
    char zifu;
    getline(cin, ip);//输入字符串
    zifu = getchar();//输入字符
    int N = Chazhao(ip, zifu);
    cout << N << endl;
    
    return 0;
}

3.

vector向量:是一个能够存放任意类型的动态数组

介绍 https://blog.csdn.net/guoyiyan1987/article/details/80325782

例:

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

vector<int> OperateInput(int size,  vector<int> arr)
{
    vector<int> res;
    for(int i = 0; i < size; i++)
    {
        int temp = arr[i];
        for(int j = i + 1; j < size; j++)
        {
            if(temp == arr[j])
                arr[j] = -1;//重复元素作标记-1
        }
    }
    for(int i = 0; i < size; i++)
         if(arr[i] != -1)
             res.push_back(arr[i]);
    sort(res.begin(), res.end());
    
    return res;
}

int main()
{
    int size;//个数
    while(cin >> size)
    {
        vector<int> arr;//动态数组
        int temp;
        for(int i = 0; i < size; i++)
        {
            cin >> temp;
            arr.push_back(temp);
        }
        vector<int> result = OperateInput(size, arr);
        for(int j = 0; j <result.size(); j++)
            cout << result[j] << endl;
    }
    
    return 0;
}

4.

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

int main()
{
    string s1, s2;
    while(getline(cin, s1))
    {
        getline(cin, s2);//连续输入2个字符串
        
        if(s1.empty() == 0)//非空
        {
            if(s1.size()%8 != 0)
                s1.insert(s1.size(), 8 - s1.size()%8, '0');//在尾部补足够的0
            for(int i = 0; i < s1.size(); i += 8)
                cout << s1.substr(i, 8) <<endl;//复制子字符串,从指定位置i开始,按指定的长度8
        }
        
        if(s2.empty() == 0)//非空
        {
            if(s2.size()%8 != 0)
                s2.insert(s2.size(), 8 - s2.size()%8, '0');//在尾部补足够的0
            for(int i = 0; i < s2.size(); i += 8)
                cout << s2.substr(i, 8) <<endl;//复制子字符串,从指定位置i开始,按指定的长度8
        }
    }
    
    return 0;
}

5.

#include <iostream>
using namespace std;

int main()
{
    long num;
    cin >> num;
    while(num != 1)
    {
        for(int i = 2; i <= num; i++) //不能是i<num
        {
            if(num%i == 0)
            {
                cout << i << ' ';
                num = num / i;//i是质数之一,并把num缩小
                break;//此次for结束,再次while
            }
        }
    }
    
    return 0;
}

6.

C++中常用的两种创建动态数组方法:new()和vector.

vector是c++标准库中定义的类型,是容器的一种。标准库中容器有很知多种,vector只是最基本的一种,vector类型和数组类型的道基本功能都是一样的,就是存储同类元素,但是他与数组最大的区别就是可以实现动态存储。而new是关键字,用于动态分配内存,分配的是栈空间,要用delete来释放,否则会出现内存泄露。二者说不上什么区别,不是一样的东西。vector是一种类型,定义该容器类型用到了new。

https://blog.csdn.net/cuiy0818/article/details/81503172

#include <iostream>
using namespace std;

int main()
{
    int num;//键值对数
    cin >> num;
    int count = num;
    
    int* index = new int[num];//键 数组
    int* value = new int[num];//值 数组
    for(int i = 0; i < num; i++)
        cin >> index[i] >> value[i];
    int j = 0;
    while(j < num - 1)
    {
        if(index[j] < num)
        {
            for(int i = j + 1; i < num; i++)
            {
                if(index[i] == index[j])
                {
                    value[j] += value[i];
                    index[i] = num;
                    count--;
                }
            }
        }
        j++;
    }
    int min, temp;
    for(int i = 0; i < num - 1; i++)
    {
        min = i;
        for(int m = i+1; m < num; m++)
            if(index[min] > index[m])
                min = m;
        if(min != i)
        {
            temp = index[min];
            index[min] = index[i];
            index[i] = temp;
            temp = value[min];
            value[min] = value[i];
            value[i] = temp;
        }
    }
    for(int i = 0; i < count; i++)
        cout << index[i] << ' ' << value[i] << endl;
    delete [] index;
    delete [] value;
    
    return 0;
}

7.

vector容器find()、erase()、unique()、insert():

unique”删除“不是真正的删除,即不像erase那样把元素删除,而是把元素移到下标最末端,要注意unique返回给的迭代器是指向非重复元素的下一个地址,即重复元素的首地址。(使用unique函数一般先对容器的值排序)

https://blog.csdn.net/clz16251102113/article/details/81138137

sort(vec.begin(),vec.end());

vec.erase(unique(vec.begin(),vec.end()),vec.end());

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

int main()
{
    string str;
    vector<char> vec;
    
    while(cin >> str)
    {
        for(int i = 0; i < str.size(); i++)
        {
            if(str[i]>=0 && str[i]<=127)
                vec.push_back(str[i]);
        }
        sort(vec.begin(), vec.end());//排序
        vec.erase(unique(vec.begin(), vec.end()),  vec.end());//去重
        cout << vec.size() << endl;
    }
    
    return 0;
}

8.

字符串输入时,cin与getline()区别:

cin在接受字符串时,遇“空格”、“TAB”、“回车”都结束,getline()就没有这问题。

https://www.cnblogs.com/renzhuang/articles/6993689.html

例1

例2

9.

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

int main()
{
    string s;
    stack<string> ss;//取该栈以单词为元素单位
    while(cin >> s)//因为各词之间需要用空格来间隔开,所以此处不能用getline()
        ss.push(s);//入栈
    while(!ss.empty())
    {
        cout << ss.top();
        cout << ' ';
        ss.pop();
    }
    
    return 0;
}

10.

C++ 中的&:“&引用” 和“&取地址符”的区别和作用

引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。

https://blog.csdn.net/qq_33266987/article/details/52047473?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1

注意以下例子用和不用’&引用‘的区别:

int function(int i){
    i++
    return i;
}
int functionReference(int &i){
i++;
return i;
}
int x = 5;
function(x);		//返回值:6, x :5
functionReference(x);	//返回值:6, x :6

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

bool Compare(string &s1, string &s2)//&引用
{
    return s1 < s2;
}

int main()
{
    int n;
    vector<string> res;
    while(cin >> n)
    {
        while(n != 0)
        {
            n--;
            string m;
            cin >> m;
            res.push_back(m);
        }
        sort(res.begin(), res.end(), Compare);
        for(int i = 0; i < res.size(); i++)
            cout << res[i] << endl;
    }
    
    return 0;
}

11.

普通变量、引用变量和指针变量作函数形参的区别:

三者都是传值。普通变量时,不影响实参;引用变量时,可修改实参值;指针变量时,不影响指针本身,但通过指针可影响其指向的变量的值。所以,在C++中常用引用做形参,当不需要实参进行改变的时候在引用前加上“const”进行限制就可以了。

 

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值