我在数组上练习一个问题,我必须找到独特的元素.现在我的逻辑是找到数组中的max元素并为其定义bitset.但问题是bitset需要一个恒定的值,所以如何克服这个,下面是我的一些问题:
a)我可以用任何机会定义一个可变大小的bitset吗?
b)若没有,那么什么是用最好的方法vector<bool>
还是vector<char>
?
c)我知道boost有一个动态bitset,但是当我这样做学习时,我想知道其他方法.
幅度极点:数组中的元素,其左侧元素小于或等于它,右侧元素大于或等于它.
示例输入
3,1,4,5,9,7,6,11
Run Code Online (Sandbox Code Playgroud)
期望的输出
4,5,11
Run Code Online (Sandbox Code Playgroud)
我在面试中被问到这个问题,我必须返回元素的索引,并且只返回满足条件的第一个元素.
我的逻辑
- 取两个MultiSet(这样我们也可以考虑复制),一个用于元素的右侧,一个用于元素的左侧(极点).
- 从第0个元素开始,将所有元素放在"右边的集合"中.
- 如果第0个元素小于或等于"right set"上的所有元素,则返回其索引.
- 否则将其放入"左集"并从索引1处的元素开始.
- 遍历数组,每次从"左设置"中选择最大值,从"右设置"中选择最小值并进行比较.
- 在任何元素的任何时刻,其左边的所有值都在"左集"中,右边的值在"右集"中
码
int magnitudePole (const vector<int> &A) {
multiset<int> left, right;
int left_max, right_min;
int size = A.size();
for (int i = 1; i < size; ++i)
right.insert(A[i]);
right_min = *(right.begin());
if(A[0] <= right_min)
return 0;
left.insert(A[0]);
for (int i = 1; i < size; ++i) {
right.erase(right.find(A[i]));
left_max = *(--left.end());
if (right.size() > 0)
right_min = *(right.begin());
if (A[i] > left_max && A[i] <= right_min)
return …
Run Code Online (Sandbox Code Playgroud) 我重写了RecordReader类的"next"方法和TextInputFormat类的"getRecordReader",以便将整个段落发送到mapper而不是逐行.(我正在使用旧api和defination为我的段落添加,直到我的文本文件中出现空白行.)
下面是我的代码:
public class NLinesInputFormat extends TextInputFormat
{
@Override
public RecordReader<LongWritable, Text> getRecordReader(InputSplit split, JobConf conf, Reporter reporter)throws IOException {
reporter.setStatus(split.toString());
return new ParagraphRecordReader(conf, (FileSplit)split);
}
}
public class ParagraphRecordReader implements RecordReader<LongWritable, Text>
{
private LineRecordReader lineRecord;
private LongWritable lineKey;
private Text lineValue;
public ParagraphRecordReader(JobConf conf, FileSplit split) throws IOException {
lineRecord = new LineRecordReader(conf, split);
lineKey = lineRecord.createKey();
lineValue = lineRecord.createValue();
}
@Override
public void close() throws IOException {
lineRecord.close();
}
@Override
public LongWritable createKey() {
return new LongWritable(); …
Run Code Online (Sandbox Code Playgroud) 我正在研究这个问题并提出一个解决方案(可能需要添加一个或两个条件),但不确定这是否是正确的方法,并且发现使用两个循环很麻烦,并且不确定这是否是正确的方法是做到这一点的有效方法。如果有人有一些好的技巧来做到这一点,或者任何更好的方法将受到欢迎:),那就太好了。(语言不是障碍)
我的算法:
void nextSmaller(int number) {
int firstZeroBitHelper = 1, nextOneBitHelper;
while (firstZeroBitHelper < number) {
// when we find first lsb zero bit we'll stop
bool bit = number & firstZeroBitHelper;
if (bit == false)
break;
firstZeroBitHelper = firstZeroBitHelper << 1;
}
if (firstZeroBitHelper >= number) {
cout << "No minimum number exists" << endl;
return;
}
nextOneBitHelper = firstZeroBitHelper;
nextOneBitHelper = nextOneBitHelper << 1;
while (nextOneBitHelper < number) {
// when …
Run Code Online (Sandbox Code Playgroud) 可能这很容易,但我只是想了解我们是否可以这样做:
假设我们有一个unordered_map(string, string)
默认情况下,如果两个字符串相等,它将检查相等性.
现在,假设我们在相等运算符中再添加一个函数,即使两个字符串是彼此的字符串,也会返回true.为此,我们是否只能更新相等运算符而不是hasher(并使用默认的hasher).
例如,仅定义仿函数:
bool operator() (const string& a, const string& b) const
{
// check for anagram condition here
}
Run Code Online (Sandbox Code Playgroud) 我知道这很简单,但我无法理解它实际上是如何工作的是片段:
int test(int a, int b)
{
return (a==b);
}
Run Code Online (Sandbox Code Playgroud)
如果匹配则返回语句返回1,否则返回0.
a)这里究竟发生了什么?
b)当我们只是想比较并返回而不是使用if和else时,这是一个更好的想法吗?