每日一题 | day16(iNOC产品部-完全数计算 | 扑克牌大小)

Posted WhiteShirtI

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一题 | day16(iNOC产品部-完全数计算 | 扑克牌大小)相关的知识,希望对你有一定的参考价值。

选择题

1、对于下面的说法,正确的是____。
A 对于 struct X { short s; int i; char c; },sizeof(X) 的值等于 sizeof(s) + sizeof(i) + sizeof©
B 对于某个double变量 a,可以使用 a == 0.0 来判断其是否为零
C 初始化方式 char a[14] = “Hello, world!”; 和初始化方式 char a[14]; a = “Hello, world!”; 的效果相同
D 在gcc编译器下,对于 int i = 3; printf("%d %d", ++i, ++i),运行输出为:4 5
E 选项A、B、C、D中至少有两个是正确的
F 以上选项均不正确
正确答案 F:B选项中要判断一个双精度浮点数:if( abs(f) <= 1e-15 );C选项中第二个a是一个地址常量,要修改其值会发生段错误/font>

2、以下程序输出是____。

#include <iostream>
using namespace std;
int main(void)
{
	const int a = 10;
	int * p = (int *)(&a);
	*p = 20;
	cout<<"a = "<<a<<", *p = "<<*p<<endl;
	return 0;
}

A 编译阶段报错运行阶段报错
B a = 10, *p = 10
C a = 20, *p = 20
D a = 10, *p = 20
E a = 20, *p = 10

正确答案 D:当这里的a是局部变量时,gcc编译器结果为100,100;如果是g++编译器结果为10,100。当a为全局变量时是存储在test段的,当修改时会报错

3、以下关于STL的描述中,____是错的。
A STL容器是线程不安全的
B 当容量不够时,vector内部内存扩展方式是翻倍
C std::sort是稳定排序
D std::bitset不是一个STL容器
E std::stack默认是用deque实现的
F std::string中可以存储多个’\\0’字符

正确答案 C:sort排序并非稳定

4、以下代码共调用多少次拷贝构造函数:

Widget f(Widget u)
{
	Widget v(u);
	Widget w=v;
	return w;
}
main(){
	Widget x;
	Widget y=f(f(x));
}

A 1
B 3
C 5
D 7

正确答案 D:传参时会发生拷贝。作返回值时不会发生拷贝,或者说编译器做了优化。

5、以下代码会出现什么问题

struct Test
{
	Test( int ) {}
	Test() {}
	void fun() {}
};
void main( void )
{
	Test a(1);
	a.fun();
	Test b();
	b.fun();
}

A b.fun()会出错
B Test结构的定义中应该加上public修饰符,这样才能main函数中调用改类的方法
C Test(int){} 应该改成Test(int a){}
D 以上说法都不正确

正确答案 A:Test b();是声明一个函数,名字为b,返回值为Test类的一个对象

编程题

题目1:
在这里插入图片描述
解题思路:
获取一个数的约数,让它所有的约数相加再加1,如果等于这个约数计数器就+1,最后输出计数器的值即可

代码:

#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
void get_div_num(int v, vector<int>& vec)
{
	for (int i = 2; i <= sqrt(v); ++i)
	{
		if (v % i == 0)
		{
			vec.push_back(i);
			int v1 = v / i;
			if (v1 != i)
				vec.push_back(v1);
		}
	}
}
int count(int n)
{
	int count = 0;
	for (int i = 2; i <= n; ++i)
	{
		vector<int> vec;
		get_div_num(i, vec);
		int sum = 0;
		for (int j = 0; j < vec.size(); ++j)
		{
			sum += vec[j];
		}
		sum += 1;
		if (sum == i)
			count++;
	}
	return count;
}
int main()
{
	int n;
	while (cin >> n)
	{
		cout << count(n) << endl;
	}
	return 0;
}

题目2:
在这里插入图片描述
解题思路:
先根据’-'字符将左右手牌分别分割出来,再获取它们各自牌的牌数,如果不同则表示一定存在一个炸弹另一个非炸弹或者是存在一个为王炸,如果是王炸则直接输出王炸,如果不是王炸就判断谁的牌数为4,为4的就是炸弹则则直接输出。当牌数相同时,只有5种情况:都为单、双、三个、炸弹、顺子。由于牌都是从小到大排序好的了,即使是顺子,都只要比较第一张牌的大小即可。但是存在特殊字符JQKA2,这时候我们可以定义一个表,该表的下标表示的是他们的大小。根据第一张牌的位置,来决定牌的大小。最后谁大就输出谁。
代码:

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

string findMax(const string& line)
{
    int div = line.find('-');
    string car1 = line.substr(0, div);
    string car2 = line.substr(div + 1);
    
    //获取两手牌的牌数
    int car1_cnt = count(car1.begin(), car1.end(), ' ') + 1;
    int car2_cnt = count(car2.begin(), car2.end(), ' ') + 1;
    
    if (car1_cnt != car2_cnt)//存在炸弹
    {
        if (car1 == "joker JOKER" || car2 == "joker JOKER")
            return "joker JOKER";
        if (car1_cnt == 4)
            return car1;
        else if (car2_cnt == 4)
            return car2;
        else
            return "ERROR";
    }
    else //牌数相同则比较第一张牌的大小
    {
        string tb = "345678910JQKA2";
        string car1_first = car1.substr(0, car1.find(' '));
        string car2_first = car2.substr(0, car2.find(' '));
        int car1_first_v = tb.find(car1_first);
        int car2_first_v = tb.find(car2_first);
        return car1_first_v > car2_first_v ? car1 : car2;
    }
}

int main()
{
    string line, res;
    while (getline(cin, line))
    {
        res = findMax(line);
        cout << res << endl;
    }
    return 0;
}

以上是关于每日一题 | day16(iNOC产品部-完全数计算 | 扑克牌大小)的主要内容,如果未能解决你的问题,请参考以下文章

2018/5/16面试题目整理(每日一题)

每日一题 | day15( 查找输入整数二进制中1的个数 | 手套)

《LeetCode之每日一题》:197.有效的完全平方数

算法·每日一题(详解+多解)-- day15

算法·每日一题(详解+多解)-- day15

算法·每日一题(详解+多解)-- day15