else // a[i] + b[j] > d
--j ;
}
}
サブセグメントの最大合計
整数配列 a が与えられた場合、最大の連続サブセグメントの合計を求めます。 sum は負の数であり、1、2、-5、6、8 などの 0 として計算され、出力は 6 + 8 = 14 となります。
パールのプログラミングに関する古典的な質問ですが、あまり言うことはありません
コードをコピーします
コードは次のとおりです:
// 部分配列の最大合計
int Sum(int* a, int n)
{
int curSum = 0;
int maxSum = 0;
for (int i = 0; i {
if (curSum + a[i] curSum = 0;
else
{
curSum += a[i]
maxSum = max(maxSum, curSum) ; ;
}
最大サブセグメント積
整数 a が与えられた場合、1、2、-8、12、7 などの最大の連続サブセグメントの積を求めると、出力は 12 * 7 = 84 になります。
最大サブセグメント合計と同様に、負の数の場合に注意してください。
コードをコピー
コードは次のとおりです: //部分配列の最大積
int MaxProduct(int *a, int n) {
int maxProduct = 1;現在位置
int minProduct = 1; // 現在位置での最小の負の積
int r = 1; // 結果、合計の最大乗算
for (int i = 0; i {
if ( a[i] > 0)
{
maxProduct *= a[i];
minProduct = min(minProduct * a[i], 1);
else if (a[i] == 0)
maxProduct = 1 ;
minProduct = 1;
else // a[i] <
int = maxProduct = max(minProduct * a[i], 1); * a[i ];
}
r = max(r, maxProduct);
}
配列循環シフト
n 要素を含む配列を右に循環移動するには複雑な時間が必要です次数は O(n) で、追加変数は 2 つだけ使用できます。これは Microsoft の The Beauty of Programming で見られる質問です。
たとえば、配列 1 2 3 4 を右に 1 ビット循環シフトすると、4 1 2 3 になります。シフトの前後で 1 2 3 の順序は変わっていないことがわかりますが、 4 の位置を入れ替えただけなので、1 2 3 と同等です。まず 4 を 2 つの部分 1 2 3 | 4 に分割し、次に 1 2 3 の順序を逆にして、次に 4 の順序を逆にして 3 2 1 4 を取得します。最後に全体の順序を逆にして、4 1 2 3 を取得します。
コードをコピーします
コードは次のとおりです:
//バッファ内の開始と終了の間の要素の順序を反転します
void Reverse( intbuffer[], int start, int end)
{
while ( start < end )
{ int temp =buffer[ start ] ; buffer[ start++ ] = temp ; // バッファn 個の要素を含む配列 k ビットを右にシフトします void Shift( intbuffer[], int n, int k )
{ k %= n ;
Reverse(buffer, 0, n - k - 1) ; , n - k , n - 1 ) ;
Reverse(buffer, 0, n - 1 ) ;
}
文字列の順序を逆にする
n 個の要素を含む文字配列を与えて、それをその場で反転します。
おそらく、これは配列に関するものではなく、文字列に関するものだと思うでしょう。はい。ただし、質問ではインプレースの逆順序が必要であることを忘れないでください。つまり、追加のスペースの割り当ては許可されないため、文字列は変更できないため、パラメータは文字配列の形式でなければなりません(ここでは文字列のみです) C/C++ の定数) なので、これは配列に関連していますが、整数配列ではなく文字配列です。 2 つのポインタを使用して文字配列の最初の位置を指し、対応する文字を交換して、2 つのポインタが交差するまで配列の中心に向かって移動します。
コードをコピー
コードは次のとおりです:
// 文字列の逆順
void Reverse(char *a, int n)
{
int left = 0
int right = n - 1;
while ( left < right)
{
char temp = a[left] ;
a[left++] = a[right] } } 組み合わせ問題
n 個の要素を含む整数配列 a が与えられた場合、そこから m 個の要素をランダムに選択し、すべての組み合わせを見つけます。たとえば、次の例:
a = 1, 2, 3, 4, 5
m = 3
出力:
1 2 3, 1 2 4, 1 2 5, 1 3 4, 1 3 5, 1 4 5
2 3 4, 2 3 5, 2 4 5
3 4 5
典型的な順列と組み合わせの問題では、問題を単純化するために、n 個の要素の値を設定することが推奨されます。それぞれ a ~ 1 ~ n。
コードをコピーします
コードは次のとおりです:
//n m
intbuffer[100]; のすべての組み合わせを選択します
void PrintArray(int *a, int n)
{
for ( int i = 0; i < ++i)
cout <{
for (int i = 0; i < lastIndex; i++)
{
if (buffer[i] > = value) return false } return true }
void Select( int t, int n, int m) {
if (t == m)
PrintArray(buffer, m)
else
{
for (int i = 1; i {
;バッファ[t] = i;
if (IsValid(t, i))
Select(t + 1, n, m);
2 つの配列をマージします。
n 個の要素を含む 2 つの順序付けされた (降順ではない) 整数配列 a と b が与えられます。 2 つの配列の要素を整数配列 c にマージし、重複する要素を削除し、c の順序を (降順ではなく) 保ちます。例は次のとおりです。
a = 1, 2, 4, 8
b = 1, 3, 5, 8
c = 1, 2, 3, 4, 5, 8
マージソートの考え方を使用する、 2 つのポインター i 、 j 、 k がそれぞれ配列 a と b を指し、2 つのポインターに対応する要素のサイズを比較します。
a[i]
a[i] == の 3 つの状況があります。 b[j]、次に c[k] a[i] または b[j] と等しくなります。
a[i] > b[j]、その場合、c[k] = b[j]。
i または j が配列の末尾に達するまで上記のプロセスを繰り返し、残りの要素を配列 c に直接コピーします。
コードをコピーします コードは次のとおりです:
// 2つの順序付けられた配列をマージします
void Merge(int *a, int *b, int *c, int n)
{
int i = 0 ;
int j = 0 ;
int k = 0 ;
while (i if (a[i] {
c[k++] = a[i]
}
else if (a[i] == b[j])// a と b が等しい場合、両方を挿入できます。ここでは、 a
{
c[k++] = a[i]
++j ; を挿入します。 b[j] / / b の要素が小さい場合は、b の要素を c に挿入します
{
c[k++] = b[j]
++j ;
if (i == n) // a が Completed を通過する場合、b の残りの要素を処理します
{
for (int m = j; m c[k++] = b[m]
else/ ; /j == n、b がトラバースされる場合、a の残りの要素を処理します
{
for (int m = i; m c[k++] = a[m]
;
繰り返しソート問題
0 個の要素と 0 以外の要素を含む n 個の要素を含む整数配列 a が与えられた場合、配列をソートします。
ソート後、すべての 0 要素が前にあり、すべてが非ゼロ要素になります。ゼロの要素は後ろにあり、ソートの前後でゼロの要素の相対位置は変わりません。
追加のストレージスペースは使用できません。
例は次のとおりです: 入力 0、3、0、2、1、0、0、出力 0、0、0、0、3、2、1。
このソートは、ソートの前後で非ゼロ要素の相対位置が変化しないことが必要なため、従来の意味でのソートではありません。おそらく、ソートと呼ぶ方が適切でしょう。配列全体を後ろから前にたどることができます。特定の位置 i の要素が 0 以外の要素である場合、a[k] が 0 の場合、a[i] は a[k] に代入され、a[ k]には値が割り当てられます。実際、i は非ゼロ要素の添字であり、k は 0 要素の添字です。
コードをコピー
コードは次のとおりです:
void Arrange(int* a, int n)
{
int k = n - 1; for (int i = n - 1; i > = 0; --i) { if (a[i] != 0) {
if (a[k] == 0)
{
a[k] = a[i] ; ] = 0
}
--k
}
}
http://www.bkjia.com/PHPjc/323992.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/323992.html
技術記事
配列の合計 n 個の要素を含む整数配列 a が与えられた場合、a 内のすべての要素の合計を求めます。もしかしたら、とても単純なことだと思うかもしれません、確かに単純ですが、それでもなぜそう言うのですか?理由は 2 つあります...