牛客刷题系列(完全数计算,扑克牌大小)


CSDN话题挑战赛第2期
参赛话题: 面试宝典

很多小伙伴为了刷题发愁
今天为大家推荐一款刷题神奇哦:刷题面试神器牛客
各大互联网大厂面试真题。从基础到入阶乃至原理刨析类面试题 应有尽有,赶快来装备自己吧!助你面试稳操胜券,solo全场面试官.

一:完全数计算

1.1题目:

链接

image-20220928224200772

1.2思路

  • 根据完全数的定义写就好了
  • 注意循环

1.3旧版本

#include<iostream>
using namespace std;

int Count_Of_Perfect_Number(int n)
{
int count = 0, sum = 0;
for(int i=2; i<=n; ++i)
{
  for(int j=1; j<i; ++j)  //效率不高
  {
         if(i % j == 0)  //对约数进行求和
             sum += j;
     }
     if(sum == i)
         count++;
     sum = 0;
 }
 return count;
}

int main()
{
 int n, count;
 while(cin >> n)
 {
  count = Count_Of_Perfect_Number(n);
  cout<<count<<endl;
}
return 0;
}

for(int j=1; j<i; ++j) 将i全部遍历了一遍,时间复杂度为O(n),效率不高

1.4效率高的版本

#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;

int Count(int n)
{
int count = 0, sum = 0;
for(int i=2; i<=n; ++i)
{
  for(int j=1; j<=sqrt(i); ++j) 
  {
         if(i % j == 0)  //对约数进行求和
          {
            sum += j;
            if( i/j != sqrt(i) && j!=1)
            {
                sum += i/j;
            }
          }   
     }
     if(sum == i)
         count++;
     sum = 0;
 }
 return count;
}

int main()
{
 int n, count;
 while(cin >> n)
 {
  count = Count(n);
  cout<<count<<endl;
}
return 0;
}

if(i % j == 0) //对约数进行求和
{
sum += j;
if( i/j != sqrt(i) && j!=1)
{
sum += i/j;
}
}

将O(n)的时间复杂度降到了 O(logn)

1.5注意事项

  1. 注意头文件的包含:#include<math.h>
  2. 注意开平方根函数的写法: sqrt()

二:扑克牌大小

2.1题目

image-20220928230250019

2.2思路

  • 我们可以将牌的状态分为三个:

  • 我们就可以根据这三个状态来解析本题:
  1. 王炸:
  if(s1.size() ==11 || s2.size()==11) //王炸
  {
       if(s1.size() == 11)
           cout<<s1;
      else
          cout<<s2;
  }
  1. 普通炸
  else if(s1.size() == 7 || s2.size() == 7) // 普通炸
  {
       if(s1.size() == 7 && s2.size() == 7)
           cout<<(s1[0]>s2[0]?s1:s2);
       else if(s1.size() !=7)
           cout<<s2;
      else 
          cout<<s1;
  }
  1. 其他:
   else
   {
      int count1 = count(s1.begin(),s1.end(),' ');
      int count2 = count(s2.begin(),s2.end(),' ');
      
      if(count1 != count2)
      {
          cout<<"ERROR";
          return 0;
      }
      string compre("345678910JQKA2jokerJOKER");
      string f1 = s1.substr(0,s1.find(' '));
      string f2 = s2.substr(0,s2.find(' '));
      if(compre.find(f1) >compre.find(f2))
      cout<<s1;
      else  
      cout<<s2;
   }

2.3 代码实现

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

int main()
{
  string s;
  getline(cin,s);
  int pos = s.find('-');
    
  string s1(s.begin(),s.begin()+pos);
  string s2(s.begin()+pos+1,s.end());
   
  if(s1.size() ==11 || s2.size()==11) //王炸
  {
       if(s1.size() == 11)
           cout<<s1;
      else
          cout<<s2;
  }
  else if(s1.size() == 7 || s2.size() == 7) // 普通炸
  {
       if(s1.size() == 7 && s2.size() == 7)
           cout<<(s1[0]>s2[0]?s1:s2);
       else if(s1.size() !=7)
           cout<<s2;
      else 
          cout<<s1;
  }
   else
   {
      int count1 = count(s1.begin(),s1.end(),' ');
      int count2 = count(s2.begin(),s2.end(),' ');
      
      if(count1 != count2)
      {
          cout<<"ERROR";
          return 0;
      }
      string compre("345678910JQKA2jokerJOKER");
      string f1 = s1.substr(0,s1.find(' '));
      string f2 = s2.substr(0,s2.find(' '));
      if(compre.find(f1) >compre.find(f2))
      cout<<s1;
      else  
      cout<<s2;
   }
  return 0;
}

2.4注意事项

  1. 对string类函数的运用:
      int count1 = count(s1.begin(),s1.end(),' ');
      int count2 = count(s2.begin(),s2.end(),' ');
  • count函数可以快速求出牌数
  1. string f1 = s1.substr(0,s1.find(' '));
          string f2 = s2.substr(0,s2.find(' '));
    

    substr可以快速得到首牌

    string compre("345678910JQKA2jokerJOKER");
    

    创建一个表来比较相同类型值的大小

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪芙花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值