問題描述:
兩字串變數 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...