【C++】牛客面试经典题,查找组成一个偶数最接近的两个素数.二进制插入.统计回文.连续最大和.不要二.把字符串转换成整数

目录

1.查找组成一个偶数最接近的两个素数

2.二进制插入

3.strlen和sizeof

4.strcat和strcpy

5.多维数组的解引用

6. 统计回文

7.  连续最大和

8.转义字符%

9.不要二

10.把字符串转换成整数


1.查找组成一个偶数最接近的两个素数

观察这个题目的要求,我们发现这两个素数一定是分布在n两侧

为了提高效率,可以从中间开始寻找

最后输出的两个素数必须满足:1.是素数 2.这个素数对的差,比其他满足1的素数对要小

 

#include <iostream>
using namespace std;
bool is_prime(int x)
{
for(int i=2;i<x;i++)
{
    if(x%i==0) return false;
}
return true;
}
int main() {
    int a, b;
    int n;
    cin>>n;
    int gap=n;
    int i=n/2;
    while(i)
    {
       if(is_prime(i) && is_prime(n-i))
       {
        if(n-i-i<gap)
        {
            a=i;
            b=n-i;
            gap=n-i-i;
        }
       }
       i--;
    }
  cout<<a<<endl;
  cout<<b<<endl;
  return 0;
}

2.二进制插入

首先观察他给的例子

                        6        2

1024:0100  0000  0000

19:          0001   0011

位运算之后变成

            0100 0100    1100

其实你有没有发现,他就是把m(19)左移j,之后和n加在一起

因为n在要插入的一段都是0,所以直接加上也不会有进位

 3.strlen和sizeof

 strlen:计算字符串长度,遇到'\0'就停止,并不会记录'\0'

sizeof:计算数组所占内存空间的大小,因为本题是数组里面是char类型数据,所以sizeof的结果=字符串长度*1  看起来好像计算长度,实际不是

4.strcat和strcpy

注意这两个函数返回值:strcat返回追加之后字符串的首元素地址

strcat(p1+x,p2+y):把p1+x位置一直到p1结束的字符串拿出来 加上 p2+y位置一直到p2结束的字符串,最后返回p1+x位置的地址

strcpy(p1+x,p2+y):把p2+y拷贝到p1+x位置,返回p1的地址

 5.多维数组的解引用

类比一下我们熟悉的二维数组解引用的方式 

 6. 统计回文

解题思路就是把第二个字符串依次插入一下第一个字符串的空隙,看看构不构成回文,然后统计次数

#include <iostream>
#include <string>
using namespace std;
bool is(string s)
{
  for(int i=0;i<=s.size();i++)
  {
    if(s[i]!=s[s.size()-i-1]) return false;
  }
return true;
}
int main() {
     string s1,s2;
     cin>>s1;cin>>s2;
     int ans=0;
     for(int i=0;i<=s1.size();i++)
     {
        string tmp=s1;
        tmp.insert(i,s2);
        if(is(tmp)) ans++;
     }
cout<<ans<<endl;
return 0;
}

7.  连续最大和

 

#include <iostream>
using namespace std;

int main() {
    int sum; //记录当前位置的总和
    int ans; //最大的连续和
    int n; //个数

    cin >> n >> sum; //直接把第一个输入的数字作为起始的和
    ans = sum;
    while (--n) //因为已经输入一个数字,只需要输入n-1次
    {
        int t; //临时变量接下来的数字
        cin >> t;
        sum = max(sum + t, t); //sum判断一下加不加这个变量
        ans = max(ans, sum); //ans是之前的ans和sum的最大
    }
    cout << ans << endl;
    return 0;
}

8.转义字符%

在printf进行流输入的时候,需要规定输入的格式,一般用%

%后面如果加上比较特殊的字母,比如:%s(以字符串的形式输出),%d(以整数的形式输出),%f(以浮点数的方式)...

但是后面如果是一般的字符,编译器默认忽略第一个%

比如%q,编译器会默认忽略%,只输出q

 

9.不要二

 

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

int main() {
 int row,col;
 cin>>row>>col;
 vector<vector<int>> vv(row,vector<int>(col,0)); //初始化
 int ans=0;
 for(int i=0;i<vv.size();i++)
 {
    for(int j=0;j<col;j++)
    {
        if(!vv[i][j])
       {
         ans++;
        if(i+2<row)
        vv[i+2][j]=1;
        if(j+2<col)
        vv[i][j+2]=1;
       }
    }
 }
 cout<<ans<<endl;
}

 10.把字符串转换成整数

 

class Solution {
public:
    int StrToInt(string str) {
        int flag=1;
        int i=0;
         if(str[i]=='-' || str[0]=='+')
        {
            if(str[0]=='-')
            flag=-1;
            i++;
        }
        
int ans=0;
for(;i<str.size();i++)
{
     
    if(str[i]<'0'||str[i]>'9')
    return 0;
    ans=ans*10+str[i]-'0';
}
      return flag*ans; 
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_71138261/article/details/129897198