剣はoffer(12,13)の数値の整数の次数を指して、配列の順序を調整して奇数を偶数の前に位置させます
7526 ワード
1.数値の整数次数
時間制限:1秒空間制限:32768 Kテーマは、与えられたdoubleタイプの浮動小数点数baseとintタイプの整数exponentを記述する.baseのexponent次数を求めます.
標準の高速べき乗...注意baseは0 return 0で、私はJSで間違いを投げてojの上でQQQを間違えてまた負数の情況があって、正になって、それから逆戻りします.実はこのbaseはdoubleタイプで、C++の中の話は直接比較することができなくて、absを書く必要があります
私はjsで書くとまずこの問題を考えない.あとは高速べき乗の思想で、実はバイナリ化して答えを再編成して、答えを再編する時底数は新しいbaseです.時間複雑度はバイナリの長さ,すなわちlognである.(参照ツリーの深さ)
2.奇数が偶数より前になるように配列順序を調整する
時間制限:1秒空間制限:32768 K整数配列を入力し、すべての奇数が配列の前半に位置し、すべての偶数が配列の後半に位置し、奇数と奇数、偶数と偶数の相対的な位置が変わらないように関数を実現します.
この問題を見て、私はソートの思想を思い出しました.この問題はソートの変種です.ただ、ここでソートのルールを再制定しただけで、通常の降順や昇順ではありません.
2つの方向、時間は空間を変えて、空間は時間を変えます.
タイムスワップ
挿入思想とバブルソート思想を利用することができ,時間交換空間にも2つの方法がある.
1.元の配列上で操作して、順序付けの思想を挿入して、2つのポインタを制定して、iとj、iは前の掃面から第1の偶数を見つけて、jはi+1から第1の奇数をスキャンして見つけて、i......j-1は後ろに1つの位置を移動し、tmp=array[j]を事前に保存し、j位置のtmpをi位置に挿入し、交換を完了する.eg:1 2 4 6 7 i j->交換後1 7 2 4 6,jはi+1であるため,iがjを見つけなければ見つからない(iはlenに着く)という判断境界を利用する.
時間の複雑さO(N^2)はもちろん空間的にかなり節約できました.(サードパーティ配列なし)
2.上のことを理解すると、きっと泡で並べ替えたいと思ってしまう
O(N^2)の複雑さでもあります
くうかんへんかんじかん
O(n)線形時間の複雑さ,空間的に1つの配列を多く開く.
時間制限:1秒空間制限:32768 Kテーマは、与えられたdoubleタイプの浮動小数点数baseとintタイプの整数exponentを記述する.baseのexponent次数を求めます.
標準の高速べき乗...注意baseは0 return 0で、私はJSで間違いを投げてojの上でQQQを間違えてまた負数の情況があって、正になって、それから逆戻りします.実はこのbaseはdoubleタイプで、C++の中の話は直接比較することができなくて、absを書く必要があります
boolean equal(double num1,double num2){
if(num1-num2>-0.000001&&num1-num2<0.000001)
return true;
else
return false;
}
私はjsで書くとまずこの問題を考えない.あとは高速べき乗の思想で、実はバイナリ化して答えを再編成して、答えを再編する時底数は新しいbaseです.時間複雑度はバイナリの長さ,すなわちlognである.(参照ツリーの深さ)
/*
2^11 = 2^1 * 2^2 * 2^8
2^1011 = 1* 2^0001 + 1* 2^0010 + 0*2^0000 +1* 2^1000
11 = 1011(2)
1*x^8 + 0*x^4 + 1*x^2 + 1*x
x , -> ( 2 )
*/
function Power(base, exponent)
{
p = exponent;
if(base==0) return 0;
else if(p==0) return 1;
else if(p<0)
p = -p;//
var ans = 1;
while(p) {
// console.log(p);
if(p&1) {
ans *= base;
}
base*=base;//
p = p>>1;//
}
return exponent>0?ans:1/ans;
}
console.log(Power(2, 3));
2.奇数が偶数より前になるように配列順序を調整する
時間制限:1秒空間制限:32768 K整数配列を入力し、すべての奇数が配列の前半に位置し、すべての偶数が配列の後半に位置し、奇数と奇数、偶数と偶数の相対的な位置が変わらないように関数を実現します.
この問題を見て、私はソートの思想を思い出しました.この問題はソートの変種です.ただ、ここでソートのルールを再制定しただけで、通常の降順や昇順ではありません.
2つの方向、時間は空間を変えて、空間は時間を変えます.
タイムスワップ
挿入思想とバブルソート思想を利用することができ,時間交換空間にも2つの方法がある.
1.元の配列上で操作して、順序付けの思想を挿入して、2つのポインタを制定して、iとj、iは前の掃面から第1の偶数を見つけて、jはi+1から第1の奇数をスキャンして見つけて、i......j-1は後ろに1つの位置を移動し、tmp=array[j]を事前に保存し、j位置のtmpをi位置に挿入し、交換を完了する.eg:1 2 4 6 7 i j->交換後1 7 2 4 6,jはi+1であるため,iがjを見つけなければ見つからない(iはlenに着く)という判断境界を利用する.
function reOrderArray(array)
{
if(array.length==0) return [];
var len = array.length;
var i = 0;
while(iwhile (i < len && judge_q(array[i])) i++;
var j = i + 1;
while (j < len && !judge_q(array[j])) j++;
if (j < len) {
var tmp = array[j];
for (var k = j; k > i; k--) {
array[k] = array[k - 1];
}
array[i] = tmp;
}else {
break;
}
}
return array;
}
function judge_q(a) {
if(a&1) return true;
else return false;
}
var b = [1,2,4,6,7];
console.log(reOrderArray(b));
時間の複雑さO(N^2)はもちろん空間的にかなり節約できました.(サードパーティ配列なし)
2.上のことを理解すると、きっと泡で並べ替えたいと思ってしまう
//C++
for (int i = 0; i < array.size();i++)
{
for (int j = array.size() - 1; j>i;j--)
{
if (array[j] % 2 == 1 && array[j - 1]%2 == 0) //
{
swap(array[j], array[j-1]);
}
}
}
O(N^2)の複雑さでもあります
くうかんへんかんじかん
O(n)線形時間の複雑さ,空間的に1つの配列を多く開く.
function reOrderArray(array)
{
var ans_q = [];
var ans_o = [];
for(var i = 0; i <array.length; i++) {
if(array[i]&1) {
ans_q.push(array[i]);
}
else {
ans_o.push(array[i]);
}
}
return ans_q.concat(ans_o);
}