生活随笔
收集整理的這篇文章主要介紹了
阿里内推算法岗位编程笔试题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/u014744127/article/details/79431847 </div><link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css"><div id="content_views" class="markdown_views prism-atom-one-dark"><!-- flowchart 箭頭圖標 勿刪 --><svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg><p>先挖坑,昨天剛剛幫師兄做的題目。過兩天有時間來填坑。<br>
算法崗是地圖上色,相鄰塊顏色不同問題,類似以前奧數的五色地圖。遞推求公式可解。 ###/填坑部分 *****/ ###題目表述: 一個圓分成n個扇形,用m種顏色上色,要求相鄰兩個顏色不同。求有多少種不同的方法。 ###思路: 首先考慮一些奇怪的臨界值 n=1:有m種可能。 n=2:有m(m-1)種可能。 m<2:并且n>2:毫無可能。 然后考慮正常情況 第一個扇面有m種可能,在不考慮最后一個和第一個扇面的顏色關系情況下,后面的n-1塊都是有m-1種可能性。但這樣得到的可能性是多的,接下來就是要考慮減去第一塊和最后一塊同色的情況。 當同色時候,其實可以把兩個扇面融合,看成一個扇面,這是本題求解的關鍵。這樣減去的部分就可以變成問題參數是(n-1,m)時得到的可能性。 遞歸表達式出來了: ###S(n,m) = m*(m-1)^(n-1) - S(n-1,m) 其實可以進一步運用高中數學中數列知識,把m看成常數,配一下項,變成等比數列,直接得到最后通式: ###Sn = (-1)^n * (m-1) + (m-1)^n 具體操作不展開了…因為我懶,并且打公式好煩。
代碼如下:
#include <iostream>
#include <math.h>
using namespace std;
double digui(int n, int m){if(n==1)return m;if(n==2){if (m<2)return 0.0;return (double)m*(m-1);}return m*pow(double(m-1), double(n-1))-digui(n-1, m);
}
int main(){int N, M;cin >> N >> M;int ans = 0;ans=(int)digui(N,M);printf("%d", ans);return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
開發崗是求矩陣最短路徑,DP思想,構建狀態矩陣可解。 ###/填坑部分 *****/ ###題目表述: 一行方格還是瓷磚n個,有m種顏色可以用來上色,每個格子上色的價格是不同(比如第一個上紅色5元,第二個上紅色3元)。要求相鄰格子的顏色不同情況下,最小花費是多少。 輸入格式: n m 第一格填不同顏色的價格:a b c …(一共m行) 。 。 。 第n格… 比如: 3 3 12 10 8(給第一個格子上色,三種顏色的價格) 6 5 4 9 5 4 ###思路: 第一眼以為和算法崗一樣,后來仔細一看就發現天差地別。這是經典的DP,狀態轉移。 找不到題目了,拍照不清楚。。。 大概就是一個矩陣,里面都是正數,然后從最上面走到最下面最小cost是多少這種題目一樣,只不過加了一個不能相鄰格子走直線而已。
</div><link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-258a4616f7.css" rel="stylesheet"></div>
先掛題目
————————————————————————————————————————————————————————
光明小學的小朋友們要舉行一年一度的接力跑大賽了,但是小朋友們卻遇到了一個難題:設計接力跑大賽的線路,你能幫助他們完成這項工作么? 光明小學可以抽象成一張有N個節點的圖,每兩點間都有一條道路相連。光明小學的每個班都有M個學生,所以你要為他們設計出一條恰好經過M條邊的路徑。 光明小學的小朋友們希望全盤考慮所有的因素,所以你需要把任意兩點間經過M條邊的最短路徑的距離輸出出來以供參考。
你需要設計這樣一個函數: res[][] Solve( N, M, map[][]); 注意:map必然是N * N的二維數組,且map[i][j] == map[j][i],map[i][i] == 0,-1e8 <= map[i][j] <= 1e8。(道路全部是無向邊,無自環)2 <= N <= 100, 2 <= M <= 1e6。要求時間復雜度控制在O(N^3*log(M))。
map數組表示了一張稠密圖,其中任意兩個不同節點i,j間都有一條邊,邊的長度為map[i][j]。N表示其中的節點數。 你要返回的數組也必然是一個N * N的二維數組,表示從i出發走到j,經過M條邊的最短路徑 你的路徑中應考慮包含重復邊的情況。
——————————————————————————————————————————————————————
題目特別長,加上有點緊張,光是讀題目就花了很久的時間。淚流滿面謹以此題紀念即將三掛阿里的我。
——————————————————————————————————————————————————————
思路有點類似與求和問題,牛客網上的一道題目https://www.nowcoder.com/practice/11cc498832db489786f8a03c3b67d02c?tpId=85&&tqId=29869&rp=1&ru=/activity/oj&qru=/ta/2017test/question-ranking但不完全一樣。有興趣可以做做。
先掛代碼吧。。。
package ali; import java.util.Scanner; public class zhaolu { public static void main (String[] args) { Scanner input = new Scanner(System.in); int n = input.nextInt(); int m = input.nextInt(); long [][] map = new long [n][n]; for (int i = 0 ; i < n; i++) { for (int j = 0 ; j < n; j++) { map[i][j] = input.nextLong(); } } long [][] res = new long [n][n]; for (int i = 0 ; i < res.length; i++) { for (int j = 0 ; j < res.length; j++) { res[i][j] = Integer.MAX_VALUE; } } for (int i = 0 ; i < n; i++) { int nowrow = i; int nowcol = i; int distance = 0 ; solve(nowcol, m, map, res, distance, nowrow); } for (int i = 0 ; i < res.length; i++) { for (int j = 0 ; j < res.length; j++) { System.out.print(res[i][j] + " " ); } System.out.println(); } } public static void solve (int nowcol, int m, long [][] map, long [][] res, long distance, int nowrow) { if (m == 0 ) { if (distance < res[nowrow][nowcol]) { res[nowrow][nowcol] = distance; return ; } return ; } for (int nextcol = 0 ; nextcol < map[0 ].length; nextcol++) { if (nowcol != nextcol) { solve(nextcol, m - 1 , map, res, distance + map[nowcol][nextcol], nowrow); } } return ; } }
其實就一個solve函數。
nowrow,記錄當前是哪一個出發點,每一行可以對應一個出發點。
nowcol,記錄當前走到了哪一個節點。
m,用來記錄還需要走多少步。
res,記錄最短路徑的矩陣
distance,表示當前走的距離
跳出遞歸的條件是,m==0也就是走完了規定的步數,更改記錄的條件是,當前這種走法比以前的走法都要短。
遞歸過程中下一步是不能與當前位置重合的。
突然發現沒什么好講的了……這題思路并不難,就是參數比較多,處理起來容易出錯……
祝大家好運~我再去哭一會兒……
編程題共3道,貌似與其它崗位的小伙伴題目都不一樣,本人遇到的難度較低。另外題面包含錯別字以及描述不太清晰,值得吐槽。
第一題 最小整數
有一個32位整數n,試找一個最小整數m,使得m的每一位之積等于n,如果找不到這樣的整數,輸出0
分析可知,整數m的所有位均為2-9的整數,對n做質因數分解變形(每次從9-2取數字做整除),能成功分解證明可以找到合適的整數,然后對分解出來的數字進行排序,從小到大輸出,未發現明顯trick,1A
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <cstdlib> #include <algorithm> #define LL long long using namespace std ;LL m ,n; LL item[1000 ]; LL cnt; int yinshufenjie (LL num) {cnt =0 ; LL i; LL temp = num; do { temp=num; for (i = 9 ;i >=2 ;i--) { while (num != i) { if (num%i == 0 ) { item[cnt++] = i; num = num / i; } else break ; } } }while (temp != num); if (num<10 ){ item[cnt++]=num; return 1 ; } else { return 0 ; } } int main () { LL m ,n; cin >>n; if (yinshufenjie(n)){ sort(item,item+cnt); for (int i=0 ;i<cnt;i++){ cout <<item[i]; } cout <<endl ; } else { cout <<"0" <<endl ; } return 0 ; }
第二題? NTES子串判斷
水題,判斷是否存在目標順序的字符
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <cstdlib> #define LL long long using namespace std ;int main () { int t; char s[101 ]; char ntes[10 ]="NTES\0" ; int len = strlen (ntes); cin >>t; while (t--){ cin >>s; int cnt =0 ; int l = strlen (s); for (int i=0 ;i<l;i++){ if (s[i]==ntes[cnt]){ cnt++; } if (cnt>len){ break ; } } if (cnt == len){ cout <<"yes" <<endl ; } else { cout <<"no" <<endl ; } } return 0 ; }
第三題 樹的深度
給出n 和 n行,n代表樹有n個節點,接下來的n行,每一行有兩個數字,代表該節點的左右子節點是否存在,1為存在,-1為不存在。節點輸入的順序有序,第一組為根節點的左右子節點,求樹的最大深度。
分析:已知節點有序,證明同樣深度的節點順序出現,從子節點信息也可以累加下一層有多少個節點,因此只需要遍歷輸入,統計當前層和下一層有多少節點,累加深度即可
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <cstdlib> #define LL long long using namespace std ;struct node { int left; int right; }tree[101 ]; int main () { int n; cin >>n; int father[101 ]; int left,right; int cp=1 ; int nextp=0 ; int dep = 1 ; for (int i=0 ;i<n;i++){ cp--; cin >>left>>right; if (left>0 ){ nextp+=1 ; } if (right>0 ){ nextp+=1 ; } if (cp==0 ){ cp=nextp; if (cp>0 ){ dep+=1 ; } nextp=0 ; } } cout <<dep<<endl ; return 0 ; }
?
總結
以上是生活随笔 為你收集整理的阿里内推算法岗位编程笔试题 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。