C++で数値リストを並べ替えて最大の数を作成するプログラム
問題の概要
nums という数値のリストが与えられたとき、その順序を並べ替えて、可能な限り最大の数を作成し、文字列として返すことを考えます。
例えば、nums = [20, 8, 85, 316] の場合、出力は "88531620" となります。
解決のアプローチ
この問題を解くためには、以下の手順に従います。
- 配列 temp を定義します
- nums の各要素 i に対して、文字列に変換して temp に挿入します
- temp を辞書順に基づいてソートします(2つの文字列 a, b を比較する際、「a + b」が「b + a」より大きいかどうかを判定します)
- temp の各文字列 s を順番に res に連結します
- res を返します
比較関数のポイント
このアルゴリズムの核心は比較関数 cmp にあります。単純に文字列を辞書順で比較するだけでは、例えば "3" と "30" のようなケースで正しい結果が得られません。そこで、2つの文字列を連結した結果の大小を比較することで、「どちらの順序で並べた方が大きな数になるか」を正しく判定できます。例えば "3" と "30" の場合、"330" は "303" より大きいため、"3" を先に配置するのが正解です。
実装例
以下の実装を見ると、より理解が深まります。
#include <bits/stdc++.h>
using namespace std;
static bool cmp(string a, string b) {
return (a + b) >= (b + a);
}
string solve(vector<int>& nums) {
vector<string> temp;
for (int i : nums) {
temp.push_back(to_string(i));
}
sort(temp.begin(), temp.end(), cmp);
string res;
for (string s : temp) {
res += s;
}
return res;
}
int main(){
vector<int> v = {20, 8, 85, 316};
cout << solve(v);
}入力
{20, 8, 85, 316}出力
88531620
まとめ
このように、数値を文字列に変換してから連結結果で比較してソートすることで、リストの並べ替えによって作れる最大の数を効率よく求めることができます。計算量はソートに依存し、O(n log n) で処理できるため、要素数が多い場合でも実用的です。
-
Pythonで2つの数値リストから最大距離ペアを求めるプログラム
問題の概要同じ長さ n を持つ2つの数値リスト A と B が与えられているとします。このとき、すべての 0 ≤ i < j < n に対して、次の式の最大値を求める必要があります。|a[i] − a[j]| + |b[i] − b[j]| + |i − j|例えば、入力が A = [2, 4, 10, 6]、B = [3, 4, 7, 5] の場合、出力は 14 になります。これは i = 0、j = 2 のときに |2 − 10| + |3 − 7| + |0 − 2| = 8 + 4 + 2 = 14 となるためです。解法のアプローチすべてのペア (i, j) を総当たりで調
-
Pythonで数値リストから作れる最大の数を求める2つの方法
この記事では、与えられた数値のリストを並べ替えて作れる「最大の数」を求める方法を解説します。例えば [45, 35, 138, 43, 67] というリストがあった場合、これらの数字をどのような順序で並べれば最も大きな整数になるのでしょうか。本記事では、全順列を試すシンプルな方法と、ソートを活用した効率的な方法の2つのアプローチを、コード例とともにわかりやすく紹介します。 方法1: itertools.permutationsで全順列を調べる まずは、itertoolsモジュールのpermutationsメソッドを使って、考えられるすべての並び順(順列)を生成し、その中から最大値を探す方法です