描述
键盘输入一个长度为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;
}