我正在从Java过渡到C++,并对long数据类型有一些疑问.在Java中,要保存大于2 32的整数,您只需编写long x;.但是,在C++中,它似乎long既是数据类型又是修饰符.
似乎有几种使用方法long:
long x;
long long x;
long int x;
long long int x;
Run Code Online (Sandbox Code Playgroud)
此外,似乎有一些事情,如:
long double x;
Run Code Online (Sandbox Code Playgroud)
等等.
所有这些不同的数据类型之间有什么区别,它们都有相同的目的吗?
我有3类调用RedAlert,YellowAlert和BlueAlert.
在我的课堂上,AlertController我希望有一个像这样的方法:
public void SetAlert(//TAKE IN NAME OF CLASS HERE//)
{
CLASSNAME anInstance = new CLASSNAME();
}
Run Code Online (Sandbox Code Playgroud)
所以例如我想:
AlertController aController = new AlertController();
SetAlert(RedAlert);
Run Code Online (Sandbox Code Playgroud)
如何将类名作为参数,并根据该类名从类名创建适当的对象?
在C++中找到两个范围的交集的最佳方法是什么?例如,如果我有一个范围为[1 ... 20],包括[13 ... 45],则我想得到[13 ... 20],因为这是它们之间的交集.
我想过在C++中使用本机集合交集函数,但我首先要将范围转换为集合,这对于大值需要花费太多的计算时间.
假设您正在堆上创建一个目标数组,如下所示:
myClass * objectPtr = new myClass[10];
Run Code Online (Sandbox Code Playgroud)
new 只调用默认构造函数,并且(根据我的读数)不允许调用任何其他构造函数.
是否有任何逻辑背后为什么new不能调用任何其他构造函数?做类似的事情似乎更好
myClass * objectPtr = new myClass[10](12);
Run Code Online (Sandbox Code Playgroud)
而不是
myClass * objectPtr = new myClass[10];
objectPtr[0] = myClass(12);
objectPtr[1] = myClass(12);
...
Run Code Online (Sandbox Code Playgroud) 我知道你可以找到最长的回文子在O(N)与manacher的算法,但有可能找到的总人数在O(N)或O的回文子的(N log n)的?如果是这样,你会怎么做呢?
将单个字母计为回文.
因此,例如," xyxyx " 的回文子串的数量是9.
这是因为你有:
5 single letter palindromes (x,y,x,y,x)
3 palindromes with three letters (xyx, yxy, xyx)
1 palindrome with five letters (xyxyx)
for a total of 5+3+1 = 9 palindromic substrings.
Run Code Online (Sandbox Code Playgroud) 假设有无限数量的工人,每个工人都可以完成一项任务,每项工作都需要一些时间.还有一些优先约束,其中一个任务在另一个任务完成之前无法完成.在遵守优先顺序的同时完成每项任务所需的最短时间是多少?
举个例子,假设您有3个任务.
第一个任务需要10个单位的时间来完成,第二个任务需要5个单位的时间来完成,第三个任务需要6个单位的时间来完成.
约束是第3个任务完成后才能启动第2个任务.
鉴于此,您可以得出结论,在尊重优先级的同时完成所有任务所需的最短时间为11.
这是因为您可以同时执行任务1和3(分别需要10和6),任务3完成后,您可以从任务2(需要5个单位时间)开始.因此,所有任务将在时间11结束.
看起来这可以通过拓扑排序来解决,这将为您提供完成任务以满足约束的顺序.
例如,在问题中,在拓扑排序任务后,您最终会得到
Task 1 (10 Units of time) -> Task 3 (6 Units of time) -> Task 2 (5 Units of time)
Run Code Online (Sandbox Code Playgroud)
但是,一旦你获得了执行任务的顺序,你如何确定哪些可以同时完成,哪些需要一个接一个地完成?此外,您如何计算所有这些完成所需的最短时间?
我在这里查看这个问题的解决方案,我不太明白动态编程(DP)是如何工作的.
该问题的摘要如下:给出一个9x9网格的1或0,排列在9个3x3子网格中,如下所示:
000 000 000
001 000 100
000 000 000
000 110 000
000 111 000
000 000 000
000 000 000
000 000 000
000 000 000
Run Code Online (Sandbox Code Playgroud)
您需要找到所需的最小更改次数,以便九个行,列和3x3子网格中的每一个都包含偶数个1.这里,变化被定义为将给定元素从1切换到0,反之亦然.
解决方案涉及动态编程,每个状态由最小移动次数组成,使得直到当前行的所有行都具有偶数奇偶校验(偶数个1).
但是,我不了解其实施的细节.首先,在他们的memoization数组中
int memo[9][9][1<<9][1<<3][2];
Run Code Online (Sandbox Code Playgroud)
每个索引代表什么?我收集到前两个用于当前行和列,第三个用于列奇偶校验,第四个用于子网格奇偶校验,第五个用于行奇偶校验.但是,为什么列奇偶校验需要2 ^ 9个元素,而行奇偶校验只需要2个?
接下来,处理状态之间的转换是如何处理的?我会假设你在尝试每个元素的时候穿过这行,并在完成后移动到下一行,但看到他们的代码后我很困惑
int& ref = memo[r][c][mc][mb][p];
/* Try setting the cell to 1. */
ref = !A[r][c] + solve(r, c + 1, mc ^ 1 << c, mb ^ 1 << c / 3, !p);
/* Try setting the cell to …Run Code Online (Sandbox Code Playgroud) 让我们说你有类似的东西
#include <iostream>
#include <vector>
using namespace std;
vector<int> test()
{
vector <int> x(1000);
for (int i = 0; i < 1000; i++)
{
x[i] = 12345;
}
return x;
}
int main(int argc, const char * argv[])
{
vector<int> a = test();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在函数中你创建一个向量并用一些元素填充它(在这种情况下我选择12345但它们不一定都是相同的).
我已经读过,向量的元素存储在堆上,而引用和头数据存储在堆栈中.在上面的代码中,x返回时必须调用一个拷贝构造函数,这需要花费O(n)的时间将所有元素复制到一个新的向量中.
但是,是否有可能利用所有元素已经存在于堆上的事实,以便只返回类似指向这些元素的指针,然后创建一个使用该指针的向量,以便指向那些完全相同的元素 - 从而避免复制矢量的所有元素的需要?
\n\n\n给定两个排序数组 \xef\xbf\xbca[] 和 \xef\xbf\xbcb[],大小分别为 \xef\xbf\xbcN1 和 \xef\xbf\xbcN2 ,设计一个算法来查找第 k 大键。算法最坏情况运行时间的增长顺序应该是 \xef\xbf\xbc \xef\xbf\xbclg(N1+N2)。
\n
这个问题的提示说有两种可能的解决方案:
\n\n\n\n\n方法 A:计算 \xef\xbf\xbca[] \xef\xbf\xbc 中的中位数和 \xef\xbf\xbc b[]\xef\xbf\xbc 中的中位数。\n 在大约一半的子问题中重现尺寸。
\n
我已经实现了这个解决方案(其本质包括将 a[] 和 b[] 调整大小/截断为长度 k,找到每个中值,比较它们,并选择数组 \xe2\x80\x94 处理的适当一半适当的极端情况。)
\n\n给出的另一种方法是:
\n\n\n\n\n设计一个恒定时间算法来确定 \xef\xbf\xbca[i] \xef\xbf\xbc 是否是第 k\n 最大的密钥。使用此子例程和二分查找。
\n
我无法找到如何采用这种方法。我知道,只要给定一个数组,只需查看该元素的索引,就可以在 O(1) 时间内找到给定元素是否是第 k 大键。但是,我不确定当两个数组如何确定一个元素是否是这两个数组的并集中的第 k 大元素。
\n考虑
using namespace std;
template <typename S, typename T> struct hash<pair<S, T>>
{
inline size_t operator()(const pair<S, T> &v) const
{
return 0;
}
};
Run Code Online (Sandbox Code Playgroud)
在这种情况下,GCC和Clang都可以编译好,没有任何警告.然而,这似乎与我在线阅读的内容相矛盾,即定义您自己的哈希函数与标准库的无序类型一起使用需要您将定义放在std命名空间中.
有趣的是,专门针对pair<int, int>:
template <> struct hash<pair<int, int>>
{
size_t operator()(const pair<int, int> &v) const
{
size_t seed = 0;
return seed;
}
};
Run Code Online (Sandbox Code Playgroud)
导致我们预期的错误.
但是,为什么第一个不会导致任何编译器警告,尽管我们没有将它放在std命名空间中?
c++ ×5
algorithm ×4
arrays ×2
constructor ×1
intersection ×1
java ×1
long-integer ×1
new-operator ×1
palindrome ×1
pointers ×1
range ×1
search ×1
sorting ×1
vector ×1