寒假牛客刷题第二天

描述

键盘输入一个长度为len(1 <= len < 30)的字符串,再输入一个正整数 m(1 <= m <= len),将此字符串中从第 m 个字符开始的剩余全部字符复制成为另一个字符串,并将这个新字符串输出。要求用指针处理字符串。

输入描述:

键盘输入一个长度为len(1 <= len < 30)的字符串,再输入一个正整数 m(1 <= m <= len)

输出描述:

输出复制的新字符串  

#include <iostream>
using namespace std;

int main() {

    char str[30] = { 0 };
    cin.getline(str, sizeof(str));

    int m;
    cin >> m;

    // write your code here......
    char*p = str +m -1; //数组下标减一
    while(*p !='\0')
    {
        cout<<*p;
        p++;
    }
    
    return 0;
}

 

关于异或运算的一些事

问题1 :查找数组中只出现一次的数

此时可以采用异或,由于异或运算的规则 :相同为0 不同为1

思路:定义一个变量赋值为0 ,0异或一个不为0的数该数就为不为0的数 一个数异或上自己为0

void solution(int* arr, int len)  //使用异或运算得出只出现一次的数字
{
	int ret = 0;
	for (int i = 0; i < len; i++)
	{
		ret = ret ^ arr[i];
	}

	cout << ret << endl;
}
问题2:查找数组中只出现一次的数,但有两个

思路:1 仍可采用异或运算 ,首先先定义一个变量赋值为0,遍历数组此时变量的值就为 两个数值的异或

        2  补码和原码相与 得到二进制位最右侧的1

        3  当变量和 补码和原码相与的结果相与为0或  为1再去用异或遍历数组得到其中的一个

        4  定义一个变量再去和之前的相异或就得到其中的一个

void solution2(int* arr, int len)
{
	int ret = 0;
	for (int i = 0; i < len; i++)
	{
		ret ^= arr[i];
	}
	int rightone = ret  &(~ret + 1);
	int onlyone = 0;
	for (int j = 0; j < len; j++)
	{
		if ((rightone & arr[j]) == 0)
		{
			onlyone = onlyone ^ arr[j];
		}
	}

	int  num = onlyone ^ ret;
	cout << num << " " << onlyone << endl;
}

问题三

使用动态数组开辟

描述

键盘输入一个正整数 n,创建大小为 n 的数组(采用动态数组的方式),将数组中的元素初始化为 n、n+1、...、2n - 1。并输出数组中的元素。

输入描述:

键盘输入一个正整数 n

输出描述:

输出数组中的元素,元素和元素之间使用空格隔开

#include <iostream>
using namespace std;

int main() {

    int n;
    cin >> n;
    
    // write your code here......
    /*
    int *p = new int[n];
    for(int i = 0 ; i< n ; i++ )
    {
        p[i] = n+i;
        cout<<p[i]<<" ";
    }
    */
    int *p = new int[n];
    for(int i = n ; i<=2*n-1;i++)
    {
        p[i] = i;
        cout<<p[i]<<" ";
    }
    return 0;
}

题目4

描述

有一个数组 int arr[n],要求写一个函数:void func(int *p, int n);将数组 arr 中为 0 的元素都移至数组末尾,将非 0 的元素移至开始(保持原来的顺序不变)。

例如:

数组中元素原来是:1 0 3 4 0 -3 5

经过 func 处理后:1 3 4 -3 5 0 0

输入描述:

键盘输入 6 个整数,保存到数组中

输出描述:

经过 func 处理后数组的元素,元素和元素之间使用空格隔开

例如:1 3 4 -3 5 0 0

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

void func(int* p, int n);

int main() {

    int arr[6] = { 0 };
    for (int i = 0; i < 6; i++) {
        cin >> arr[i];
    }

    func(arr, 6);

    for (int i = 0; i < 6; i++) {
        if (i == 5) {
            cout << arr[i] << endl;
        }
        else {
            cout << arr[i] << " ";
        }
    }

    return 0;
}

void func(int* p, int n) {

    // write your code here......
    //    int num = n-1;
    for(int i = 0; i< n ; i++)
    {
       if(p[i] == 0)
       {
        for(int j = i;j<n-1;j++)
        {//考虑越界问题 如果j<n的程序设置不合理将会越界
            swap(p[j],p[j+1] );
        }
       }
    }
    

}

题目5

编写一个函数 int mystrcmp(const char * src, const char * dst),用于比较两个字符串的大小(自己实现strcmp()函数)。要求如果字符串src大于字符串dst返回 1,小于返回 -1,相等返回 0。

输入描述:

键盘录入 2 个长度小于 100 的字符串

输出描述:

输出调用 mystrcmp() 函数返回的结果

思路:

1:先求出两个字符串的长度 len1 len2

        2:定义总长度 在len1 和len2 中取最大值

        然后以总长度为基准遍历数组

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

int mystrcmp(const char* src, const char* dst);

int main() {

    char s1[100] = { 0 };
    char s2[100] = { 0 };

    cin.getline(s1, sizeof(s1));
    cin.getline(s2, sizeof(s2));

    int ret = mystrcmp(s1, s2);

    cout << ret << endl;

    return 0;
}

int mystrcmp(const char* src, const char* dst) {

    // write your code here......
    /*
    思路 1:先求出两个字符串的长度 len1 len2 
        2:定义总长度 在len1 和len2 中取最大值
        然后以总长度为基准遍历数组
    
    */
    int len1  = strlen(src);  int len2  = strlen(dst);
    int len = len1>len2?len1:len2;
    for(int i =0;i< len ;i++)
    {
        if(src[i]>dst[i])
        {
            return 1;
        }else if(src[i]<dst[i])
        {
            return -1;
        }
        
    }
    //函数需要有返回值
         return 0;
}

  • 17
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值