当前位置: 首页 > 面试题库 >

我如何操纵一个数组以得到最大的数字?

韦知
2023-03-14
问题内容

假设您有一个正整数数组,请对其进行处理,以使结果数组的整数串联成为可能的最大数。例如:{9,1,95,17,5},结果:9951571

作业警察:这是一个Google电话面试问题,未签署任何保密协议;)。


问题答案:

正如其他人指出的那样,按字典顺序排序和连接是很接近的,但并不完全正确。例如,对于数字55456字典编排,将产生 {5,54,56}
(以递增顺序)或 {56,54,5} (以递减顺序),但是我们真正想要的是 {56,5 ,54} ,因为这会产生尽可能多的数字。

因此,我们需要两个数字的比较器,以某种方式将最大的数字放在第一位。

  1. 我们可以通过比较两个数字中的单个数字来做到这一点,但是如果另一个数字仍然有剩余数字,则在离开一个数字的结尾时必须格外小心。我们必须弄清许多计数器,算术和边缘情况。

  2. 一个更可爱的解决方案(也由@Sarp Centel提到)实现了与(1)相同的结果,但代码却少得多。这个想法是 将两个数字的级联与这些数字的反向级联 进行 比较 。我们必须在(1)中显式处理的所有杂项都是隐式处理的。

例如,比较565,我们会做的一个普通字典的比较565556。由于565>
556,我们将说它56大于5,并且应该排在第一位。同样,进行比较545意味着我们将测试545<
554,这表明我们5比更大54

这是一个简单的例子:

// C++0x: compile with g++ -std=c++0x <filename>
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>

int main() {
  std::vector<std::string> v = {
    "95", "96", "9", "54", "56", "5", "55", "556", "554", "1", "2", "3"
  };
  std::sort(v.begin(), v.end(),
      [](const std::string &lhs, const std::string &rhs) {
        // reverse the order of comparison to sort in descending order,
        // otherwise we'll get the "big" numbers at the end of the vector
        return rhs+lhs < lhs+rhs;
      });

  for (size_t i = 0; i < v.size(); ++i) {
    std::cout << v[i] << ' ';
  }
}

运行时,此代码显示:

9 96 95 56 556 5 55 554 54 3 2 1


 类似资料:
  • 我有一个数组,我需要三个数中最大的一个数和各自的索引值。我有一个这样的数组: 如何找到最大的数字及其索引值?

  • 我想要这样的结果。依靠这个数组,我想在其中得到一个随机值。

  • 计算newArr数组所有对象中arr二维数组,比较后返回其中的[[最小值,最小值],[最大值,最大值]]; 要这种结果[[39.867638888888884, 115.39333333333333], [50.97152777777777, 120.31527777777778]]

  • 我是java新手,我创建了两个arraylists,然后在while循环中向用户请求一个数字,一旦我从第1点和第2点获得了所需数量的数字。我将arrayllists转换为数组。我需要比较两个点阵,然后将最低点的缺失数字设置为零。例如 点1=(12,123,123,435,6756,667)//6个数字 点 2=(23,13,35)//3 个数字 点 3=(23,13,35,0,0,0)//新数组替

  • 问题内容: 这个问题已经在这里有了答案 : 使用Java在原始数组中查找最大值/最小值 (15个答案) 5年前关闭。 这是我的代码。我需要获取数组的最小值,最大值才能为我获取范围,无论何时输入数字,最小值均为0。请帮助我。谢谢:) 问题答案: 同样,通过更改较小的符号可以找到最小值。

  • 我最近接受了一次采访,被问到了这个问题。让我适当地解释一下问题: 给定一个数M(n位整数)和K个交换操作(一个交换操作可以交换2位),设计一个算法来得到最大可能的整数? 示例: M=132 K=1输出=312 M=132 K=2输出=321 M=7899 K=2输出=9987 我的解决方案(伪代码中的算法)。我使用max-heap在每个k操作中从n个数字中获得最大的数字,然后适当地交换它。 时间复

  • 子数组包含正数和负数。你必须找到一个最大和子数组,使子数组的长度大于或等于k。 下面是我用C++编写的使用Kadane算法的代码。 我的代码工作得很好,但很慢,我想不出任何方法来改进我的代码。我也读过这个问题,找到最长的子数组,它的和可以被K整除,但这不是我想要的,长度也可以大于K。

  • 我试图找到最大的双倍数组,但困难的部分是,你必须把数组分成两个切片,但在那之后,你需要计算2个子切片的最大值,并返回2个值中的最大值,这需要使用递归。 你能给我一个如何开始的建议吗。