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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

程序员面试金典 - 面试题 16.22. 兰顿蚂蚁(deque模拟)

發布時間:2024/7/5 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 程序员面试金典 - 面试题 16.22. 兰顿蚂蚁(deque模拟) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 題目

一只螞蟻坐在由白色和黑色方格構成的無限網格上。
開始時,網格全白,螞蟻面向右側。
每行走一步,螞蟻執行以下操作。

  • (1) 如果在白色方格上,則翻轉方格的顏色,向右(順時針)轉 90 度,并向前移動一個單位。
  • (2) 如果在黑色方格上,則翻轉方格的顏色,向左(逆時針方向)轉 90 度,并向前移動一個單位。

編寫程序來模擬螞蟻執行的前 K 個動作,并返回最終的網格。

網格由數組表示,每個元素是一個字符串,代表網格中的一行,
黑色方格由 ‘X’ 表示,白色方格由 ‘_’ 表示,
螞蟻所在的位置由 ‘L’, ‘U’, ‘R’, ‘D’ 表示,分別表示螞蟻 左、上、右、下 的朝向。
只需要返回能夠包含螞蟻走過的所有方格的最小矩形。

示例 1: 輸入: 0 輸出: ["R"]示例 2: 輸入: 2 輸出: ["_X","LX" ]示例 3: 輸入: 5 輸出: ["_U","X_","XX" ]說明: K <= 100000

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/langtons-ant-lcci
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

2. 解題

蘭頓螞蟻解釋
據說最后會變成這樣的圖形,有意思!!!

2.1 超時解

K = 100000, 超時,string.insert 操作造成數據搬移,性能不高

class Solution {vector<string> ans = {"_"};// 右 下 左 上vector<char> dirCh = {'R','D','L','U'}; public:vector<string> printKMoves(int K) {int x = 0, y = 0, d = 0, columns = 1;while(K--)update(x,y,d,columns);//更新k步的地圖ans[x][y] = dirCh[d];//最后的位置填方向return ans;}void update(int& x, int& y, int& d, int& columns) {char ch = ans[x][y];ans[x][y] = (ch=='_' ? 'X' : '_');//反轉顏色d = (ch=='_' ? (d+1)%4 : (d+3)%4);//轉向if(d==0)//R{y++;if(y == ans[x].size())//需要開新的地圖,右側加列{for(string& s : ans)s += '_';columns++;}}else if(d==1)//D{x++;if(x == ans.size())//需要開新的地圖,下面加行ans.push_back(string(columns,'_'));}else if(d==2)//L{y--;if(y<0)//需要開新的地圖,左側加列{y = 0;for(string& s : ans)s = '_'+ s;columns++;}}else//U{x--;if(x<0)//需要開新的地圖,上面加行{x = 0;ans.insert(ans.begin(),string(columns,'_'));}}} };

2.2 deque解題

  • 采用雙端隊列,減少數據搬移操作
class Solution {deque<deque<char>> ans = {{'_'}};// 右 下 左 上vector<char> dirCh = {'R','D','L','U'}; public:vector<string> printKMoves(int K) {int x = 0, y = 0, d = 0, columns = 1, i = 0;while(K--)update(x,y,d,columns);//更新k步的地圖ans[x][y] = dirCh[d];//最后的位置填方向vector<string> res(ans.size());string str;for(auto& dq : ans){str = "";for(char ch : dq)str += ch;res[i++] = str;}return res;}void update(int& x, int& y, int& d, int& columns) {char ch = ans[x][y];ans[x][y] = (ch=='_' ? 'X' : '_');//反轉顏色d = (ch=='_' ? (d+1)%4 : (d+3)%4);//轉向if(d==0)//R{y++;if(y == ans[x].size())//需要開新的地圖,右側加列{for(auto& s : ans)s.push_back('_');columns++;}}else if(d==1)//D{x++;if(x == ans.size())//需要開新的地圖,下面加行ans.push_back(deque<char>(columns,'_'));}else if(d==2)//L{y--;if(y<0)//需要開新的地圖,左側加列{y = 0;for(auto& s : ans)s.push_front('_');columns++;}}else//U{x--;if(x<0)//需要開新的地圖,上面加行{x = 0;ans.push_front(deque<char>(columns,'_'));}}} };

516 ms 49.8 MB

總結

以上是生活随笔為你收集整理的程序员面试金典 - 面试题 16.22. 兰顿蚂蚁(deque模拟)的全部內容,希望文章能夠幫你解決所遇到的問題。

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