演算法練習1

2021-08-17 13:50:23 字數 1561 閱讀 4217

問題描述:

兩字串變數 s , m, 分別經過若干次step1和step2後得 得到乙個新s 若輸入指定長度,請返回s要達到目標長度至少需要幾步

輸入:目標長度 int len;

輸出:步數 int stepnum;

s = "a";

m;step1:

m = s;

s = s+s;

step2:

s = s+m

分析:

1.通過分析得到;(這裡的*標識將s的長度多大指定倍數)

s =s*2 需要 step1:1 step2:0

s = s*3 需要 step1:1 step2:1

s = s*4 = s*2*2 需要 step1:2 step2:0

s = s*5 需要 step1:1 step2:2

...s = s*2^n 需要 step1:n step2:0

s = s*m*n 需要 step1:2 step2: m+n-4 (m,n都是質數)

s = s*i1*i2*...in 需要 step1:n step2:(i1+i2+...+in)-2n

下面我們舉個例子

輸入:15

s = s*15

s = s*3*5 (3,5 都是質數)

所以需要 step1:2 step2:4

其他的數字也可以試一下

接下來我們解釋為什麼是這樣的規律,首先要達成一下幾個共識:

1.進行一次step1 s長度翻倍 m記錄s長度一半

2.進行一次step2 s長度增加一半

3.任何乙個正整數都可以分解為若干質數的連乘結果

所以為了減少步數,理所應當的想多選step1,有了這個思路,我們開始分析問題

例如 20 = 1*5*2*2

那麼就是 s->(若干此操作,可以經過若干次step1 和 step2)->step1->step1

對於質數5,我們發現只能用一次step1而且只能是在第一次的時候使用,因為若非這樣使用step1的話m一定會變成偶數,那麼之後不管是使用step1和step2操作都不可能出現乙個質數

所以問題就成了

s->(step1:1 和 若干次step2)->step1->step1

之後很容易就分析得到:

s->(step1:1 和 step2:(5-2))->step1->step1

於是該問題的求解過程就成了:

1.求stepnum的質因數

2.根據質因數求解步數,其實步數 = 質因數-1

**如下

public class maximumprimefactor else

flag = true;

}if (flag == true)

else}}

} system.out.println(count);

}}

演算法練習1

自己不怎麼關注演算法,但是面試的時候常有一些公司就會給演算法題目,目的也很直接,自己每日一練就好。思路 使用純 c來實現。條件1,陣列b內所有數字加起來為10 動態調整陣列b內的數值。因為時間先後的原因,會導致先前統計個數出現的次數不正確。include include static int a 1...

演算法練習1

給定乙個n times mn m的整形矩陣matrix和乙個整數k,matrix的每一行和每一列都是排好序的。實現乙個函式,判斷k是否在matrix中 要求 時間複雜度為o n m o n m 額外空間複雜度為o 1 o 1 輸入描述 第一行有三個整數n,m,k 接下來n行,每行m個整數為輸入的矩陣...

演算法設計題練習1

例1 n 1各不同的整數 a1,a2,a3,an,m 假設有乙個亂序的整數序列,其中 a1,a2,a3,a4,an均出現兩次,m出現一次 需要找出出現一次的m。功能實現 num 1,1,2,2,3,3,4,5,4,5,6,7,7,6,8,9,9,8,10 num1 for i in range le...