現有乙個 3x3 規格的 android 智慧型手機鎖屏程式和兩個正整數 m 和 n ,請計算出使用最少m 個鍵和最多 n個鍵可以解鎖該螢幕的所有有效模式總數。
其中有效模式是指:
1、每個模式必須連線至少m個鍵和最多n個鍵;
2、所有的鍵都必須是不同的;
3、如果在模式中連線兩個連續鍵的行通過任何其他鍵,則其他鍵必須在模式中選擇,不允許跳過非選擇鍵(如圖);
4、順序相關,單鍵有效(這裡可能跟部分手機不同)。
輸入:m,n
代表允許解鎖的最少m個鍵和最多n個鍵
輸出:滿足m和n個鍵數的所有有效模式的總數
輸入例子1:
1,2輸入例子1: 輸入例子1:
輸入m=1,n=2,表示最少1個鍵,最多2個鍵,符合要求的鍵數是1個鍵和2個鍵,其中1個鍵的有效模式有9種,兩個鍵的有效模式有56種,所以最終有效模式總數是9+56=65種,最終輸出65。在編寫過程中,我突然發現其實輸入9,9其實和8,8是一樣的可能性,也就是其實8和9就是一樣可能性的,因為最後9x8x7x6x5x4x3x2=9x8x7x6x5x4x3x2x1。也就是說輸入1,9其實等於1,8加上8,8的所有可能性。
**如下**片
.
// an highlighted block
//預設是flase,如果為true代表被選擇。
public
static boolean select=
newboolean[10
];//寫出所有無效的路線
public
static string numberstr=
;//與無效路線集合下標對應,值為穿過的點
public
static string pont=
;public
static int solution
(int m, int n)
int tot =0;
if(n==
9&&m<
9||n>
9&&m<9)
else
tot=
allselect
(m,n)-(
4*cal(m,n,1,
1,"")
+4*cal
(m,n,2,
1,"")
+cal
(m,n,5,
1,"")
);;}
return tot;
}public
static int allselect
(int m,int n)
if(n>9)
while
(initm>0)
else
maxselect = maxselect-1;
initm--;}
if((m+1
)<=initn)
return total;
}public
static int cal
(int m,int n,int start,int end,string str)
if(end>=m&&path.
length()
>
1&&end
} j++;}
} select[start]
=true
;for
(int i =
1;i<
10;i++)if
(!select[i]
&&end==n&&n>1)
} j++;}
}}select[start]
=false
;return count;
}
該方法參考了中的解題思路,不同的是本方法是算所有可能性包括無效模式再減去無效的模式,參考方法是直接計算所有有效的模式。 2020屆校園招聘360筆試題
1 尋找子串 思路 重複的最多的子字串,那肯定是單個字元重複的最多就行了 轉化為求單個字元出現次數最多 ss input ls s for s in ss p set ls max 0 for c in p if ls.count c max max ls.count c print max 2 散...
vivo2020春校招 數字之積
現給定任意正整數 n,請尋找並輸出最小的正整數 m m 9 使得 m 的各位 個位 十位 百位 之乘積等於n,若不存在則輸出 1。最原始的想法是遍歷,由於這個數一定不小於n,於是從n開始累加,然後轉化為字元陣列,計算積,判斷 這個方法很傻,而且很難設定終止條件。public int solution...
vivo2020春招 02 數字之積
現給定任意正整數 n,請尋找並輸出最小的正整數 m m 9 使得 m 的各位 個位 十位 百位 之乘積等於n,若不存在則輸出 1。對於n,找出2 9中所有能被它整除的數,然後組合成乙個最小的整數即可 輸入乙個整形數值,返回乙個整形值 param n int整型 n 9 return int整型 cl...