char数组中数字的最小值

时间:2013-10-01 21:32:55

标签: arrays algorithm

我最近在一次采访中遇到了这个问题,我很好奇解决它的最佳方法是什么。问题是给出一个char数组,其中ascii字符'0'到'9'进行一次交换,使得结果数组中的ascii值集形成最低可能值。输入数组都不会有前面的0,也不应该是结果数组。

所以这是一个例子:char a[] = {'1','0', '9','7','6'}

解决方案:char b[] = { '1','0', '6', '7', '9'}

另一个例子:char a[] = {'9','0', '7','6','1'}

解决方案:char b[] = {'1','0', '7','6','9'}

我正在寻找性能方面的最佳解决方案。由于只允许一次交换,我认为不允许排序。我没有澄清这一点。因此,我们正在寻找通过仅使用一个交换可以获得的最低可能值。如果你能提供解决方案的复杂性,那将会有所帮助。

4 个答案:

答案 0 :(得分:1)

<强>算法:

请注意,由于不能有前导0,因此应单独照顾0。

从右边开始,跟踪最小的非零数字。同时记录第一个0。

每当您发现一个大于记录的非零数字的数字时,请将这两个数字记录为目前为止最佳的交换。

一旦找到零,就从这里记录任何非零非领先字符作为零的最佳交换。

请注意,您没有对上述任何一次交换的质量进行任何比较,我们只是将当前最佳替换为新的交换,因为与更左侧的位置交换总是更好。

完成后,将零的最佳交换的目标位置与非零的最佳交换进行比较,并选择最左侧的位置,如果它们相同,则为零。

如果找不到可能的交换,则该数组已经是给定数字的最小排列,因此不执行任何操作。或者,如果必须,交换两个最右边的字符。

运行时间:

O(n)

示例:

输入: 10976

Processing  6   7   9   0   1
Minimum     6   6   6   6   1
Best swap   -   6+7 6+9 6+9 6+9
Zero?       No  No  No  Yes Yes
Best 0 swap -   -   -   -   -

所以最佳互换是6/9,给我们10679

输入: 3601

Processing  1   0   6   3
Minimum     1   1   1   3
Best swap   -   -   1+6 1+3
Zero?       No  Yes Yes Yes
Best 0 swap -   -   0+6 0+6

这里可能的掉期是1/3和0/6 对于1/3交换,目标位置为0(0索引) 对于0/6交换,目标位置为1.
所以我们选择1/3交换给我们1603。

答案 1 :(得分:0)

Start at the leftmost digit

While current digit is valued the lowest (non-zero for the first digits equal 
  to the number of zeroes in the set) of the remaining set of numbers, advance
  to the next number

Swap current value with lowest remaining value.

您可以保留数组的已排序副本,以帮助您进行决策制定。您需要知道当前最低数量的数量。如果存储它们的索引,也可以使它更有效。

没有必要拥有任何额外的存储空间,但它可能会让事情变得更快。在第一个数组的单个传递中,您可以获得0的数量以及索引到下一个最低的数字,但是在像1,0,6,9,7这样的数组中,您将需要通过阵列4次不同。

编辑 - 稍微刷新算法

Copy the array into a separate one, called c, and sort c.  (You'll use this to make your decision faster, though you could simply repeatedly analyze the array.)
if c has zeros, find the value of its first non-zero value, called x
if a[0] != x, swap a[0] with x.
set index to 1
while a[index] == c[index], ++index
swap a[index] with c[index]

如果你这样做,它会花费你另一个数组,但是完成了一种,一次通过数组。

如果你不这样做,你每次都必须通过数组的其余部分才能找到最小值。我在复杂性方面并不擅长,但我相信这是n log n,因为你将在每次迭代时从更高的索引开始。

不使用数组,您必须执行类似

的操作
Find the lowest non-zero value
if a[0] isn't this value, swap with this value
index = 1
find lowest value starting at a[index]
if they're not equal, swap the values, done.  Otherwise,  increment index

那仍然是n log n。我认为排序可以提高效率。

答案 2 :(得分:0)

取决于你最好的意思。 取出除“0”之外的最小数字作为b中的第一项,然后将其余数字按升序排序。

答案 3 :(得分:0)

我认为你必须至少完成一次阵列。您需要这样做才能找到最小的值。

您还需要找到满足条件的值。海报说输入数组不会有'0'作为主要元素。

我们一次将数组循环到一个位置。我们正在寻找另一个具有最小值的位置(第一个点非零,其他点的任何东西)并且比任何其他位置都小。

for (pos = 0; pos < array_size-1; pos++) {
        low_index = pos;
        min_value = (pos == 0) ? '1' : '0';

        for (i = pos+1; i < array_size; i++) {
                if (min_value <= array[i]) && (array[i] < array[low_index])) {
                        low_index = i;
                }
        }

        if (low_index != pos) {
                low_value = array[pos];
                array[pos] = array[low_index];
                array[low_index] = low_value;
                break;
        }
}