日韩国产精品99成人不卡在线无毒|狠狠躁夜夜爽一级二级精品|亚洲日日噜噜孕妇中文字幕|日韩久草中文三级片

新聞動(dòng)態(tài)

隨機(jī)算法,四大組件,Context,線程間通信,數(shù)組和鏈表

常見問題 發(fā)布者:cya 2019-11-29 08:58 訪問量:215

01

隨機(jī)算法 



問題:從撲克牌中隨機(jī)抽 5 張牌,判斷是不是順子,即這 5 張牌是不是連續(xù)的。2-10 為數(shù)字本身,A 為 1,J 為 11,Q 為 12,K 為 13,而大小王可以看成任意的 數(shù)字

解題思路:我們可以把5張牌看成是由5個(gè)數(shù)字組成的數(shù)組。大小王是特殊的數(shù)字,我們可以把它們都定義為0,這樣就可以和其他的牌區(qū)分開來。

首先把數(shù)組排序,再統(tǒng)計(jì)數(shù)組中0的個(gè)數(shù),最后統(tǒng)計(jì)排序之后的數(shù)組中相鄰數(shù)字之間的空缺總數(shù)。如果空缺的總數(shù)小于或者等于0的個(gè)數(shù),那么這個(gè)數(shù)組就是連續(xù)的,反之則不連續(xù)。如果數(shù)組中的非0數(shù)字重復(fù)出現(xiàn),則該數(shù)組是不連續(xù)的。換成撲克牌的描述方式就是如果一幅牌里含有對(duì)子,則不可能是順子。

import java.util.Arrays;

public class Solution {

public boolean isContinuous(int[] number){
if(number == null){
return false;
   }
   Arrays.sort(number);
   int numberZero = 0;
   int numberGap = 0;
//計(jì)算數(shù)組中0的個(gè)數(shù)
for(int i = 0;i < number.length && number[i] == 0; i++){
     numberZero++;
   }
//統(tǒng)計(jì)數(shù)組中的間隔數(shù)目
   int small = numberZero;
   int big = small + 1;

while(big<number.length){
//兩個(gè)數(shù)相等,有對(duì)子,不可能是順子
if(number[small] == number[big]){
return false;
     }
     numberGap+= number[big] - number[small] - 1;
     small = big;
     big++;
   }

return (numberGap>numberZero)?false:true;
 }
}




02

簡述四大組件


Activity、Service、ContentProvider 如 果 要 使 用 則 必 須 在AndroidManifest.xml 中 進(jìn) 行 注 冊 , 而BroadcastReceiver則有兩種注冊方式,靜態(tài)注冊和動(dòng)態(tài)注冊。其中靜態(tài)注冊就是指在AndroidManifest.xml中進(jìn)行注冊,而動(dòng)態(tài)注冊時(shí)通過代碼注冊。

Activity通常展現(xiàn)為一個(gè)用戶操作的可視化界面。它為用戶提供了一個(gè)完成操作指令的窗口。 (https://mp.weixin.qq.com/s/CgfeMT9YtzW2jBavG47i1Q) (Activity的來由)

ServiceAndroid系統(tǒng)的服務(wù)(不是一個(gè)線程,是主程序的一部分),與Activity不同,它是不能與用戶交互的,不能自己啟動(dòng)的,須要調(diào)用Context.startService()來啟動(dòng),執(zhí)行后臺(tái),假設(shè)我們退出應(yīng)用時(shí),Service進(jìn)程并沒有結(jié)束,它仍然在后臺(tái)行。

BroadcastReceiver廣播接收器是一個(gè)專注于接收廣播通知信息,并做出相應(yīng)處理的組件。

ContentProvider(內(nèi)容提供者)主要用于對(duì)外共享數(shù)據(jù),也就是通過ContentProvider把應(yīng)用中的數(shù)據(jù)共享給其它應(yīng)用訪問,其它應(yīng)用能夠通過ContentProvider對(duì)指定應(yīng)用中的數(shù)據(jù)進(jìn)行操作。




03

談?wù)剬?duì)Android中context的理解 


Context是一個(gè)抽象基類。在翻譯為上下文,也可以理解為環(huán)境,是提供一些程序的運(yùn)行環(huán)境基礎(chǔ)信息。Context下有兩個(gè)子類,ContextWrapper是上下文功能的封裝類,而ContextImpl則是上下文功能的實(shí)現(xiàn)類。而ContextWrapper又有三個(gè)直接的子類, ContextThemeWrapper、Service和Application。其中,ContextThemeWrapper是一個(gè)帶主題的封裝類,而它有一個(gè)直接子類就是Activity,所以Activity和Service以及Application的Context是不一樣的,只有Activity需要主題,Service不需要主題。Context一共有三種類型,分別是Application、Activity和Service。這三個(gè)類雖然分別各種承擔(dān)著不同的作用,但它們都屬于Context的一種,而它們具體Context的功能則是由ContextImpl類去實(shí)現(xiàn)的,因此在絕大多數(shù)場景下,Activity、Service和Application這三種類型的Context都是可以通用的。不過有幾種場景比較特殊,比如啟動(dòng)Activity,還有彈出Dialog。出于安全原因的考慮,Android是不允許Activity或Dialog憑空出現(xiàn)的,一個(gè)Activity的啟動(dòng)必須要建立在另一個(gè)Activity的基礎(chǔ)之上,也就是以此形成的返回棧。而Dialog則必須在一個(gè)Activity上面彈出(除非是System Alert類型的Dialog),因此在這種場景下,我們只能使用Activity類型的Context,否則將會(huì)出錯(cuò)。getApplicationContext()和getApplication()方法得到的對(duì)象都是同一個(gè)application對(duì)象,只是對(duì)象的類型不一樣。Context數(shù)量 = Activity數(shù)量 + Service數(shù)量 + 1 (1為Application)



04

Android線程間通信有幾種方式 


  1. Handler機(jī)制

  2. runOnUiThread(Runnable action)

  3. View.post(Runnable action)

  4. AsyncTask

  5. 廣播

  6. 使用EventBus、RxJava等框架




05

談?wù)剶?shù)組與鏈表的區(qū)別 


  1. 數(shù)組是將元素在內(nèi)存中連續(xù)存放,由于每個(gè)元素占用內(nèi)存相同,可以通過下標(biāo)迅速訪問數(shù)組中任何元素。但是如果要在數(shù)組中增加一個(gè)元素,需要移動(dòng)大量元素,在內(nèi)存中空出一個(gè)元素的空間,然后將要增加的元素放在其中。同樣的道理,如果想刪除一個(gè)元素,同樣需要移動(dòng)大量元素去填掉被移動(dòng)的元素。如果應(yīng)用需要快速訪問數(shù)據(jù),很少或不插入和刪除元素,就應(yīng)該用數(shù)組。


  2. 鏈表恰好相反,鏈表中的元素在內(nèi)存中不是順序存儲(chǔ)的,而是通過存在元素中的指針聯(lián)系到一起。比如:上一個(gè)元素有個(gè)指針指到下一個(gè)元素,以此類推,直到最后一個(gè)元素。如果要訪問鏈表中一個(gè)元素,需要從第一個(gè)元素開始,一直找到需要的元素位置。但是增加和刪除一個(gè)元素對(duì)于鏈表數(shù)據(jù)結(jié)構(gòu)就非常簡單了,只要修改元素中的指針就可以了。如果應(yīng)用需要經(jīng)常插入和刪除元素你就需要用鏈表數(shù)據(jù)結(jié)構(gòu)了。



關(guān)鍵字: 隨機(jī)算法 四大組件 Context 線程間通信 數(shù)組和鏈表

文章連接: http://www.hsjyfc.com.cn/cjwt/624.html

版權(quán)聲明:文章由 晨展科技 整理收集,來源于互聯(lián)網(wǎng)或者用戶投稿,如有侵權(quán),請(qǐng)聯(lián)系我們,我們會(huì)立即刪除。如轉(zhuǎn)載請(qǐng)保留