導航:首頁 > 源碼編譯 > 演算法工程師嵌入式

演算法工程師嵌入式

發布時間:2022-11-02 10:51:44

演算法工程師應該學哪些

一、演算法工程師簡介
(通常是月薪15k以上,年薪18萬以上,只是一個概數,具體薪資可以到招聘網站如拉鉤,獵聘網上看看)
演算法工程師目前是一個高端也是相對緊缺的職位;
演算法工程師包括
音/視頻演算法工程師(通常統稱為語音/視頻/圖形開發工程師)、圖像處理演算法工程師、計算機視覺演算法工程師、通信基帶演算法工程師、信號演算法工程師、射頻/通信演算法工程師、自然語言演算法工程師、數據挖掘演算法工程師、搜索演算法工程師、控制演算法工程師(雲台演算法工程師,飛控演算法工程師,機器人控制演算法)、導航演算法工程師(
@之介
感謝補充)、其他【其他一切需要復雜演算法的行業】
專業要求:計算機、電子、通信、數學等相關專業;
學歷要求:本科及其以上的學歷,大多數是碩士學歷及其以上;
語言要求:英語要求是熟練,基本上能閱讀國外專業書刊,做這一行經常要讀論文;
必須掌握計算機相關知識,熟練使用模擬工具MATLAB等,必須會一門編程語言。
演算法工程師的技能樹(不同方向差異較大,此處僅供參考)
1 機器學習
2 大數據處理:熟悉至少一個分布式計算框架Hadoop/Spark/Storm/ map-rece/MPI
3 數據挖掘
4 扎實的數學功底
5 至少熟悉C/C++或者java,熟悉至少一門編程語言例如java/python/R
加分項:具有較為豐富的項目實踐經驗(不是水論文的哪種)
二、演算法工程師大致分類與技術要求
(一)圖像演算法/計算機視覺工程師類
包括
圖像演算法工程師,圖像處理工程師,音/視頻處理演算法工程師,計算機視覺工程師
要求
l
專業:計算機、數學、統計學相關專業;
l
技術領域:機器學習,模式識別
l
技術要求:
(1) 精通DirectX HLSL和OpenGL GLSL等shader語言,熟悉常見圖像處理演算法GPU實現及優化;
(2) 語言:精通C/C++;
(3) 工具:Matlab數學軟體,CUDA運算平台,VTK圖像圖形開源軟體【醫學領域:ITK,醫學圖像處理軟體包】
(4) 熟悉OpenCV/OpenGL/Caffe等常用開源庫;
(5) 有人臉識別,行人檢測,視頻分析,三維建模,動態跟蹤,車識別,目標檢測跟蹤識別經歷的人優先考慮;
(6) 熟悉基於GPU的演算法設計與優化和並行優化經驗者優先;
(7) 【音/視頻領域】熟悉H.264等視頻編解碼標准和FFMPEG,熟悉rtmp等流媒體傳輸協議,熟悉視頻和音頻解碼演算法,研究各種多媒體文件格式,GPU加速;
應用領域:
(1) 互聯網:如美顏app
(2) 醫學領域:如臨床醫學圖像
(3) 汽車領域
(4) 人工智慧
相關術語:
(1) OCR:OCR (Optical Character Recognition,光學字元識別)是指電子設備(例如掃描儀或數碼相機)檢查紙上列印的字元,通過檢測暗、亮的模式確定其形狀,然後用字元識別方法將形狀翻譯成計算機文字的過程
(2) Matlab:商業數學軟體;
(3) CUDA: (Compute Unified Device Architecture),是顯卡廠商NVIDIA推出的運算平台(由ISA和GPU構成)。 CUDA™是一種由NVIDIA推出的通用並行計算架構,該架構使GPU能夠解決復雜的計算問題
(4) OpenCL: OpenCL是一個為異構平台編寫程序的框架,此異構平台可由CPU,GPU或其他類型的處理器組成。
(5) OpenCV:開源計算機視覺庫;OpenGL:開源圖形庫;Caffe:是一個清晰,可讀性高,快速的深度學習框架。
(6) CNN:(深度學習)卷積神經網路(Convolutional Neural Network)CNN主要用來識別位移、縮放及其他形式扭曲不變性的二維圖形。
(7) 開源庫:指的是計算機行業中對所有人開發的代碼庫,所有人均可以使用並改進代碼演算法。
(二)機器學習工程師
包括
機器學習工程師
要求
l
專業:計算機、數學、統計學相關專業;
l
技術領域:人工智慧,機器學習
l
技術要求:
(1) 熟悉Hadoop/Hive以及Map-Rece計算模式,熟悉Spark、Shark等尤佳;
(2) 大數據挖掘;
(3) 高性能、高並發的機器學習、數據挖掘方法及架構的研發;
應用領域:
(1)人工智慧,比如各類模擬、擬人應用,如機器人
(2)醫療用於各類擬合預測
(3)金融高頻交易
(4)互聯網數據挖掘、關聯推薦
(5)無人汽車,無人機

相關術語:
(1) Map-Rece:MapRece是一種編程模型,用於大規模數據集(大於1TB)的並行運算。概念"Map(映射)"和"Rece(歸約)",是它們的主要思想,都是從函數式編程語言里借來的,還有從矢量編程語言里借來的特性。
(三)自然語言處理工程師
包括
自然語言處理工程師
要求
l
專業:計算機相關專業;
l
技術領域:文本資料庫
l
技術要求:
(1) 熟悉中文分詞標注、文本分類、語言模型、實體識別、知識圖譜抽取和推理、問答系統設計、深度問答等NLP 相關演算法;
(2) 應用NLP、機器學習等技術解決海量UGC的文本相關性;
(3) 分詞、詞性分析、實體識別、新詞發現、語義關聯等NLP基礎性研究與開發;
(4) 人工智慧,分布式處理Hadoop;
(5) 數據結構和演算法;
應用領域:
口語輸入、書面語輸入
、語言分析和理解、語言生成、口語輸出技術、話語分析與對話、文獻自動處理、多語問題的計算機處理、多模態的計算機處理、信息傳輸與信息存儲 、自然語言處理中的數學方法、語言資源、自然語言處理系統的評測。

相關術語:
(2) NLP:人工智慧的自然語言處理,NLP (Natural Language Processing) 是人工智慧(AI)的一個子領域。NLP涉及領域很多,最令我感興趣的是「中文自動分詞」(Chinese word segmentation):結婚的和尚未結婚的【計算機中卻有可能理解為結婚的「和尚「】

(四)射頻/通信/信號演算法工程師類
包括
3G/4G無線通信演算法工程師, 通信基帶演算法工程師,DSP開發工程師(數字信號處理),射頻通信工程師,信號演算法工程師
要求
l
專業:計算機、通信相關專業;
l
技術領域:2G、3G、4G,BlueTooth(藍牙),WLAN,無線移動通信, 網路通信基帶信號處理
l
技術要求:
(1) 了解2G,3G,4G,BlueTooth,WLAN等無線通信相關知識,熟悉現有的通信系統和標准協議,熟悉常用的無線測試設備;
(2) 信號處理技術,通信演算法;
(3) 熟悉同步、均衡、信道解碼等演算法的基本原理;
(4) 【射頻部分】熟悉射頻前端晶元,扎實的射頻微波理論和測試經驗,熟練使用射頻電路模擬工具(如ADS或MW或Ansoft);熟練使用cadence、altium designer PCB電路設計軟體;
(5) 有扎實的數學基礎,如復變函數、隨機過程、數值計算、矩陣論、離散數學
應用領域:
通信
VR【用於快速傳輸視頻圖像,例如樂客靈境VR公司招募的通信工程師(數據編碼、流數據)】
物聯網,車聯網
導航,軍事,衛星,雷達
相關術語:
(1) 基帶信號:指的是沒有經過調制(進行頻譜搬移和變換)的原始電信號。
(2) 基帶通信(又稱基帶傳輸):指傳輸基帶信號。進行基帶傳輸的系統稱為基帶傳輸系統。傳輸介質的整個信道被一個基帶信號佔用.基帶傳輸不需要數據機,設備化費小,具有速率高和誤碼率低等優點,.適合短距離的數據傳輸,傳輸距離在100米內,在音頻市話、計算機網路通信中被廣泛採用。如從計算機到監視器、列印機等外設的信號就是基帶傳輸的。大多數的區域網使用基帶傳輸,如乙太網、令牌環網。
(3) 射頻:射頻(RF)是Radio Frequency的縮寫,表示可以輻射到空間的電磁頻率(電磁波),頻率范圍從300KHz~300GHz之間(因為其較高的頻率使其具有遠距離傳輸能力)。射頻簡稱RF射頻就是射頻電流,它是一種高頻交流變化電磁波的簡稱。每秒變化小於1000次的交流電稱為低頻電流,大於10000次的稱為高頻電流,而射頻就是這樣一種高頻電流。高頻(大於10K);射頻(300K-300G)是高頻的較高頻段;微波頻段(300M-300G)又是射頻的較高頻段。【有線電視就是用射頻傳輸方式】
(4) DSP:數字信號處理,也指數字信號處理晶元
(五)數據挖掘演算法工程師類
包括
推薦演算法工程師,數據挖掘演算法工程師
要求
l
專業:計算機、通信、應用數學、金融數學、模式識別、人工智慧;
l
技術領域:機器學習,數據挖掘
l
技術要求:
(1) 熟悉常用機器學習和數據挖掘演算法,包括但不限於決策樹、Kmeans、SVM、線性回歸、邏輯回歸以及神經網路等演算法;
(2) 熟練使用SQL、Matlab、Python等工具優先;
(3) 對Hadoop、Spark、Storm等大規模數據存儲與運算平台有實踐經驗【均為分布式計算框架】
(4) 數學基礎要好,如高數,統計學,數據結構
l
加分項:數據挖掘建模大賽;
應用領域
(1) 個性化推薦
(2) 廣告投放
(3) 大數據分析
相關術語
Map-Rece:MapRece是一種編程模型,用於大規模數據集(大於1TB)的並行運算。概念"Map(映射)"和"Rece(歸約)",是它們的主要思想,都是從函數式編程語言里借來的,還有從矢量編程語言里借來的特性。
(六)搜索演算法工程師
要求
l
技術領域:自然語言
l
技術要求:
(1) 數據結構,海量數據處理、高性能計算、大規模分布式系統開發
(2) hadoop、lucene
(3) 精通Lucene/Solr/Elastic Search等技術,並有二次開發經驗
(4) 精通Lucene/Solr/Elastic Search等技術,並有二次開發經驗;
(5) 精通倒排索引、全文檢索、分詞、排序等相關技術;
(6) 熟悉Java,熟悉Spring、MyBatis、Netty等主流框架;
(7) 優秀的資料庫設計和優化能力,精通MySQL資料庫應用 ;
(8) 了解推薦引擎和數據挖掘和機器學習的理論知識,有大型搜索應用的開發經驗者優先。
(七)控制演算法工程師類
包括了雲台控制演算法,飛控控制演算法,機器人控制演算法
要求
l
專業:計算機,電子信息工程,航天航空,自動化
l
技術要求:
(1) 精通自動控制原理(如PID)、現代控制理論,精通組合導航原理,姿態融合演算法,電機驅動,電機驅動
(2) 卡爾曼濾波,熟悉狀態空間分析法對控制系統進行數學模型建模、分析調試;
l
加分項:有電子設計大賽,機器人比賽,robocon等比賽經驗,有硬體設計的基礎;
應用領域
(1)醫療/工業機械設備
(2)工業機器人
(3)機器人
(4)無人機飛控、雲台控制等

(八)導航演算法工程師
要求
l 專業:計算機,電子信息工程,航天航空,自動化
l 技術要求(以公司職位JD為例)
公司一(1)精通慣性導航、激光導航、雷達導航等工作原理;
(2)精通組合導航演算法設計、精通卡爾曼濾波演算法、精通路徑規劃演算法;
(3)具備導航方案設計和實現的工程經驗;
(4)熟悉C/C++語言、熟悉至少一種嵌入式系統開發、熟悉Matlab工具;
公司二(1)熟悉基於視覺信息的SLAM、定位、導航演算法,有1年以上相關的科研或項目經歷;
(2)熟悉慣性導航演算法,熟悉IMU與視覺信息的融合;
應用領域
無人機、機器人等。

㈡ 華為演算法工程師與嵌入式軟體工程師哪個好

個人偏好,嵌入式軟體工程師偏應用,演算法工程師 還是需要理論基礎的,要求更高。

㈢ 很多人問嵌入式工程師到底做些什麼月薪有多少

同樣的水平和工作經驗,不同地域,薪水差別挺大。不同公司的薪水也有差別。不同的工作年限也有差別。
我國嵌入式人才缺口每年50萬人左右。根據相關的的調查報告稱,嵌入式軟體開發是未來幾年最熱門和最受歡迎的職業之一,具有
10年工作經驗的高級嵌入式工程師年薪在30萬元左右。即使是初級的嵌入式軟體開發人員,平均月薪也達到了3000—5000元,中高級的嵌入式工程師月薪平均超過10000元。
當然找嵌入式工作也不好找,現在的基本要求:
1.精通常用的任意一種編程語言,熟悉操作系統api,有大型項目經驗。
2.但無項目經驗,一般也是都會要的
3.僅熟練使用任意一種編程語言,需要考察其對語言的掌握程度,演算法、語言缺陷的了解等。
4.能寫一些簡單代碼。這就要靠"海選"了,就是招100人以上,淘汰80-90%
嵌入式創業的話,那薪水會更不得了了!看你具體是開公司還是跟別人合作一起合作,具體的創業看你自己選擇什麼方向,那樣會更成功。像是朱有鵬就是自己創業錄視頻教學生了。

㈣ 請用通俗的語言給IT門外漢介紹一下ROS工程師,嵌入式工程師,演算法工程師之間的關系。

電子工程師指從事各類電子設備和信息系統研究、教學、產品設計、科技開發、生產和管理等工作的高級工程技術人才。一般分為硬體工程師和軟體工程師。硬體工程師主要負責電路分析、設計;並以電腦軟體為工具進行PCB設計

㈤ 想成為嵌入式工程師需要學習哪些內容

嵌入式系統是計算機軟體和硬體的綜合體,崗位包括:ESE(嵌入式軟體工程師);ADE(嵌入式應用開發工程師);FWE(嵌入式底層開發工程師);FEC(嵌入式固件開發工程師),我有全套嵌入式視頻課可以發給你自學。

課程內容主要包括:

①C,Java核心編程:c語言核心編程,Java核心編程;

②Linux核心操作與演算法:Linux系統使用,Linux-c編程核心技術,精品數據結構,Linux-c編程精髓;

③核心操作與演算法:Linux系統編程,Linux網路編程核心技術,UI編程,Java核心編程,安卓核心技術;

④ARM+Linux底層開發:數字電路,ARM編程核心,Linux系統開發,嵌入式Linux驅動開發;

⑤大型項目實踐:每期安排各類型真實的項目,詳細可以找我要資料。

互聯網行業目前還是最熱門的行業之一,學習IT技能之後足夠優秀是有機會進入騰訊、阿里、網易等互聯網大廠高薪就業的,發展前景非常好,普通人也可以學習。

想要系統學習,你可以考察對比一下開設有相關專業的熱門學校,好的學校擁有根據當下企業需求自主研發課程的能力,能夠在校期間取得大專或本科學歷,中博軟體學院、南京課工場、南京北大青鳥等開設相關專業的學校都是不錯的,建議實地考察對比一下。

祝你學有所成,望採納。

㈥ 演算法工程師如何選擇適合自己的方向

目前投了的有TX(offer) 海康威視(offer sp) DJI(offer sp) 頭條(掛) 阿里(ssp) MSRA(等消息,但hr透露不樂觀)我就介紹下我自己的一些感受,可能不一定對,但也許會幫到大家。我覺得一定要做演算法的話一定要明確下面幾點:

1. 不要一直盯著互聯網公司,很多硬體公司也需要演算法,而且是剛需。
2. 千萬不要認為視覺演算法就不用刷題了,這種必跪(我頭條就沒刷,就是例子)
3. 不是說搞dl的就不用管頻域那些傳統方法了。就比如我不止一次被問到canny演算法的具體實現方法(我還是做3D的)。 我感覺可能是真正落地的時候不可能讓你直接dl end2end的。dl只會是一個pipeline的核心的小部件,剩下的還是需要人為先驗更強的傳統方法的。
4. 最好能對一些論文里或者實驗中反直覺的方法有一些深刻的理解,最好能直接到硬體層面。舉個例子 mobilenet v2明明flops比 resnet18低那麼多,為啥電腦跑起來不會更快?又為啥放移動端就會快很多?
5. 我覺得比起論文,面試官更喜歡在知名排行榜上有個好名次的方法。
6. 實習真的很重要,尤其是大廠實習(比如阿裡面試官就說,他能撈我簡歷看上的根本不是啥paper啥排行榜。。人家是覺得MSRA培養的方法論很好。。)
7. 大家現在很多都過了那種刷論文,刷排行榜的階段了,都講落地。這意味著你要是不懂輕量級網路,剪枝蒸餾演算法的sota,你會很吃虧。同時,如果你有嵌入式經驗和cuda經驗,你會很加分。
8. 拉寬知識面。。沒事就去讀讀別的方向的paper總會有好處。
最後無論從事開發崗,還是在演算法領域,知識的更替速度快,不持續學習跟進前沿技術,就會被淘汰。演算法工程師本質上也是工程師,不要因為你是演算法而有所謂的優越感,數學模型技能只是一方面,沒有扎實的工程能力,也走不遠。尤其是AI近幾年的火爆,演算法的門檻也變低,造成越來越多的人湧入演算法崗。等到AI退潮之後,你扎實的基礎工程能力和業務能力才是生存下來的必要條件吧。

㈦ 像我這樣的情況是做嵌入式軟體開發還是做演算法

建議還是演算法吧,嵌入式也涉及演算法的,看你興趣了,其實我感覺,如果如果理論水平可以的話,就去做演算法什麼的吧,感覺演算法高端,碼農很低端

㈧ 嵌入式工程師面試中常出現的演算法

嵌入式工程師面試中常出現的演算法

嵌入式系統是以應用為中心,以計算機技術為基礎,並且軟硬體可裁剪,適用於應用系統對功能、可靠性、成本、體積、功耗有嚴格要求的專用計算機系統。下面我為大家整理了關於嵌入式工程師面試中經常出現的演算法文章,希望對你有所幫助。

二分查找的代碼.

int bfind(int* a,int len,int val)

{

int m = len/2;

int l = 0;

int r = len;

while(l!=m && r!= m)

{

if(a[m] > val)

{

r = m;

m = (m+l)/2;

}

else if(a[m] < val)

{

l = m;

m = (m+r)/2;

}

else

return m;

}

return -1; //沒有找到

}

寫出在母串中查找子串出現次數的代碼.

int count1(char* str,char* s)

{

char* s1;

char* s2;

int count = 0;

while(*str!='')

{

s1 = str;

s2 = s;

while(*s2 == *s1&&(*s2!='')&&(*s1!='0'))

{

s2++;

s1++;

}

if(*s2 == '')

count++;

str++;

}

return count;

}

查找第一個匹配子串位置,如果返回的是s1長度len1表示沒有找到

size_t find(char* s1,char* s2)

{

size_t i=0;

size_t len1 = strlen(s1)

size_t len2 = strlen(s2);

if(len1-len2<0) return len1;

for(;i {

size_t m = i;

for(size_t j=0;j {

if(s1[m]!=s2[j])

break;

m++;

}

if(j==len)

break;

}

return i }

寫出快速排序或者某種排序演算法代碼

快速排序:

int partition(int* a,int l,int r)

{

int i=l-1,j=r,v=a[r];

while(1)

{

while(a[++i] while(a[--j]>v) if(j<=i) break;

if(i>=j)

break;

swap(a[i],a[j]);

}

swap(a[i],a[r]);

return i;

}

void qsort(int* a,int l,int r)

{

if(l>=r) return;

int i = partition(a,l,r);

qsort(a,l,i-1);

qsort(a,i+1,r);

}

冒泡排序:

void buble(int *a,int n)

{

for(int i=0;i {

for(int j=1;j {

if(a[j] {

int temp=a[j];

a[j] = a[j-1];

a[j-1] = temp;

}

}

}

}

插入排序:

void insertsort(int* a,int n)

{

int key;

for(int j=1;j {

key = a[j];

for(int i=j-1;i>=0&&a[i]>key;i--)

{

a[i+1] = a[i];

}

a[i+1] = key;

}

}

出現次數相當頻繁

實現strcmp函數

int strcmp11(char* l,char* r)

{

assert(l!=0&&r!=0);

while(*l == *r &&*l != '') l++,r++;

if(*l > *r)

return 1;

else if(*l == *r)

return 0;

return -1;

}

實現字元串翻轉

void reserve(char* str)

{

assert(str != NULL);

char * p1 = str;

char * p2 = str-1;

while(*++p2); //一般要求不能使用strlen

p2 -= 1;

while(p1 {

char c = *p1;

*p1++ = *p2;

*p2-- = c;

}

}

將一個單鏈表逆序

struct list_node

{

list_node(int a,list_node* b):data(a),next(b) //這個為了測試方便

{}

int data;

list_node* next;

};

void reserve(list_node* phead)

{

list_node* p = phead->next;

if(p == NULL || p->next == NULL) return; //只有頭節點或一個節點

list_node* p1=p->next;

p->next=NULL;

while(p1!=NULL)

{

p = p1->next;

p1->next = phead->next;

phead->next = p1;

p1 = p;

}

}

測試程序:

list lt;

lt.phead = new list_node(0,0);

lt.phead->next = new list_node(1,0);

lt.phead->next->next = new list_node(2,0);

lt.phead->next->next->next = new list_node(3,0);

lt.reserve();

list_node * p = lt.phead;

while(p)

{

coutnext;

}

循環鏈表的節點對換和刪除。

//雙向循環

list_node* earse(list_node* node)

{

// if(node == rear) return node->next; //對於頭節點可判斷也可不判斷。最好加上

list_node* next = node->next;

next->prev = node->prev;

node->prev->next = next;

delete node;

retrun next;

}

//單項循環

list_node* earse(list_node* node)

{

// if(node == rear) return node->next; //對於頭節點可判斷也可不判斷。最好加上

list_node* p = rear;

while(p->next != node) p=p->next;

p->next = node->next;

delete node;

retrun p->next;

}

將一個數字字元串轉換為數字."1234" -->1234

int atoii(char* s)

{

assert(s!=NULL);

int num = 0;

int temp;

while(*s>'0' && *s<'9')

{

num *= 10;

num += *s-'0';

s++;

}

return num;

}

出現次數相當頻繁

.實現任意長度的整數相加或者相乘功能。

void bigadd(char* num,char* str,int len)

{

for(int i=len;i>0;i--)

{

num[i] += str[i];

int j = i;

while(num[j]>=10)

{

num[j--] -= 10;

num[j] += 1;

}

}

}

.寫函數完成內存的拷貝

void* memcpy( void *dst, const void *src, unsigned int len )

{

register char *d;

register char *s;

if (len == 0)

return dst;

if ( dst > src ) //考慮覆蓋情況

{

d = (char *)dst + len - 1;

s = (char *)src + len - 1;

while ( len >= 4 ) //循環展開,提高執行效率

{

*d-- = *s--;

*d-- = *s--;

*d-- = *s--;

*d-- = *s--;

len -= 4;

}

while ( len-- )

{

*d-- = *s--;

}

}

else if ( dst < src )

{

d = (char *)dst;

s = (char *)src;

while ( len >= 4 )

{

*d++ = *s++;

*d++ = *s++;

*d++ = *s++;

*d++ = *s++;

len -= 4;

}

while ( len-- )

{

*d++ = *s++;

}

}

return dst;

}

出現次數相當頻繁

編寫類String的構造函數、析構函數和賦值函數,已知類String的原型為:

class String

{

public:

String(const char *str = NULL); // 普通構造函數

String(const String &other); // 拷貝構造函數

~ String(void); // 析構函數

String & operate =(const String &other); // 賦值函數

private:

char *m_data; // 用於保存字元串

};

解答:

//普通構造函數

String::String(const char *str)

{

if(str==NULL)

{

m_data = new char[1]; // 得分點:對空字元串自動申請存放結束標志''的`空

//加分點:對m_data加NULL 判斷

*m_data = '';

}

else

{

int length = strlen(str);

m_data = new char[length+1]; // 若能加 NULL 判斷則更好

strcpy(m_data, str);

}

}

// String的析構函數

String::~String(void)

{

delete [] m_data; // 或delete m_data;

}

//拷貝構造函數

String::String(const String &other) // 得分點:輸入參數為const型

{

int length = strlen(other.m_data);

m_data = new char[length+1]; //加分點:對m_data加NULL 判斷

strcpy(m_data, other.m_data);

}

//賦值函數

String & String::operate =(const String &other) // 得分點:輸入參數為const型

{

if(this == &other) //得分點:檢查自賦值

return *this;

delete [] m_data; //得分點:釋放原有的內存資源

int length = strlen( other.m_data );

m_data = new char[length+1]; //加分點:對m_data加NULL 判斷

strcpy( m_data, other.m_data );

return *this; //得分點:返回本對象的引用

}

剖析:

能夠准確無誤地編寫出String類的構造函數、拷貝構造函數、賦值函數和析構函數的面試者至少已經具備了C++基本功的60%以上!

在這個類中包括了指針類成員變數m_data,當類中包括指針類成員變數時,一定要重載其拷貝構造函數、賦值函數和析構函數,這既是對C++程序員的基本要求,也是《EffectiveC++》中特別強調的條款。

實現strcpy

char * strcpy( char *strDest, const char *strSrc )

{

assert( (strDest != NULL) && (strSrc != NULL) );

char *address = strDest;

while( (*strDest++ = * strSrc++) != ‘’ );

return address;

}

編寫一個函數,作用是把一個char組成的字元串循環右移n個。比如原來是“abcdefghi”如果n=2,移位後應該是“hiabcdefgh”

函數頭是這樣的:

//pStr是指向以''結尾的字元串的指針

//steps是要求移動的n

void LoopMove ( char * pStr, int steps )

{

//請填充...

}

解答:

正確解答1:

void LoopMove ( char *pStr, int steps )

{

int n = strlen( pStr ) - steps;

char tmp[MAX_LEN];

strcpy ( tmp, pStr + n );

strcpy ( tmp + steps, pStr);

*( tmp + strlen ( pStr ) ) = '';

strcpy( pStr, tmp );

}

正確解答2:

void LoopMove ( char *pStr, int steps )

{

int n = strlen( pStr ) - steps;

char tmp[MAX_LEN];

memcpy( tmp, pStr + n, steps );

memcpy(pStr + steps, pStr, n );

memcpy(pStr, tmp, steps );

}

;

㈨ 嵌入式軟體工程師有必要精通演算法,參加各種編程大賽嗎

你參加ICPC沒有必要,行業不同,那是計算機軟體工程師參與的。個人感覺嵌入式工程師所涉及的演算法和計算機軟體工程師所設計的演算法有一小小差別。計算機軟體工程師要實現的是運行在通用計算機平台上的軟體,演算法研究偏向於盡量降低系統的開銷,完全不需要考慮硬體設備。

閱讀全文

與演算法工程師嵌入式相關的資料

熱點內容
匯編編譯後 瀏覽:472
php和java整合 瀏覽:827
js中執行php代碼 瀏覽:439
國產單片機廠商 瀏覽:56
蘋果手機怎麼設置不更新app軟體 瀏覽:283
轉行當程序員如何 瀏覽:491
蘋果id怎麼驗證app 瀏覽:863
查看手機命令 瀏覽:952
抖音反編譯地址 瀏覽:224
如何加密軟體oppoa5 瀏覽:232
java從入門到精通明日科技 瀏覽:93
拆解汽車解壓視頻 瀏覽:596
新版百度雲解壓縮 瀏覽:591
android上下拉刷新 瀏覽:879
centos可執行文件反編譯 瀏覽:836
林清玄pdf 瀏覽:270
黑馬程序員java基礎 瀏覽:283
awss3命令 瀏覽:358
百度店鋪客戶訂單手機加密 瀏覽:501
釘釘班群文件夾怎麼上傳文件 瀏覽:749