1、在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
bool find_target_from_two_dimensional_array(const int target, const std::vector<std::vector<int>>& array)
{
size_t row{ array.size() }; // 二维数组行数
if (0 == row)
{
return false;
}
size_t column = array[0].size(); // 二维数组列数
if (0 == column)
{
return false;
}
size_t current_row{ 0 }; // 当前处理行数
size_t current_column{ column - 1 }; // 当前处理列数
while (current_row < row && current_column >= 0)
{
int value{ array[current_row][current_column] };
if (value < target)
{
++current_row;
}
else if (value > target)
{
--current_column;
}
else
{
return true;
}
}
return false;
}
2、一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度为O(n),空间复杂度为O(1)。
//具体思路是:我们首先仍然从前向后依次异或数组中的数字,那么得到的结果是两个只出现一次的数字的异或结果,其他成对出现的数字被抵消了。由于这两个数字不同,所以异或结果肯定不为0,也就是这个异或结果一定至少有一位是1,我们在结果中找到第一个为1的位的位置,记为第n位。接下来,以第n位是不是1为标准,将数组分为两个子数组,第一个数组中第n位都是1,第二个数组中第n位都是0。这样,便实现了我们的目标。最后,两个子数组分别异或则可以找到只出现一次的数字。
//以{2,4,3,6,3,2,5,5}为例:我们依次对数组中的每个数字做异或运行之后,得到的结果用二进制表示是0010。异或得到结果中的倒数第二位是1,于是我们根据数字的倒数第二位是不是1分为两个子数组。第一个子数组{ 2,3,6,3,2 }中所有数字的倒数第二位都是1,而第二个子数组{ 4,5,5 }中所有数字的倒数第二位都是0。接下来只要分别两个子数组求异或,就能找到第一个子数组中只出现一次的数字是6,而第二个子数组中只出现一次的数字是4。
bool find_two_nums_appear_once(const vector<int>& array, int& num1, int& num2)
{
if (array.size() < 2)
{
return false;
}
int sum = 0;
for (unsigned int i = 0; i < array.size(); ++i)
{
sum ^= array[i];
}
int i;
for (i = 0; i < sizeof(int)*8; ++i)
{
if (sum & (1 << i))
{
break;
}
}
for (const auto value:array)
{
if (value & (1 << i))
{
num1 ^= value;
}
else
{
num2 ^= value;
}
}
return true;
}
3、实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy.