日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

阿里内推算法岗位编程笔试题

發布時間:2024/7/5 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 阿里内推算法岗位编程笔试题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
版權聲明:本文為博主原創文章,未經博主允許不得轉載。 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;
  • }
  • }
  • //cout<<cnt<<endl;
  • if(cnt == len){
  • cout<<"yes"<<endl;
  • }
  • else{
  • cout<<"no"<<endl;
  • }
  • }
  • return 0;
  • }
  • /*
  • 2
  • STNETEDTS
  • TSENSTE
  • */
  • 第三題 樹的深度

    給出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;
  • }
  • ?

    總結

    以上是生活随笔為你收集整理的阿里内推算法岗位编程笔试题的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。