學習程式設計(四)

2021-10-18 07:37:13 字數 3903 閱讀 8301

1.什麼是記憶體對齊?記憶體對齊有什麼意義?2. 請簡述c++中函式呼叫過程並解釋棧幀的概念。(可以舉例說明)

針對記憶體對齊,以下例子:

typedef

struct

b;

typedef

struct

a;

分別對他們求大小,sizeof(a),sizeof(b)我們所得到的結果是不同的,

sizeof(a)=24而sizeof(b)=16為什麼會產生不一樣的結果呢?

這是非常簡單的乙個例子,體現了結構體的記憶體對齊規則。

在結構體中,從結構體的首位址開始,假設位址從0開始。

對結構體a來說,a佔4個位元組,佔從03的位元組,b是double型別佔8個位元組,佔從815的位元組,c佔兩個位元組,從16~17的位元組。

對結構體b來說,a佔4個位元組,從03,b佔兩個位元組從46;c佔8個位元組從8~15。

這就是記憶體對齊,對齊規則是按照成員的宣告順序,依次安排記憶體,其偏移量為成員大小的整數倍,0看做任何成員的整數倍,最後結構體的大小為最大成員的整數倍(所以這裡的a的大小是24,而不是18)。

為什麼要記憶體對齊?

1.平台原因(移植原因):不是所有的硬體平台都能訪問任意位址上的任意資料的;某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常。

2.效能原因:資料結構(尤其是棧)應該盡可能地在自然邊界上對齊。原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問;而對齊的記憶體訪問僅需要一次訪問。

2.給你乙個由若干 0 和 1 組成的字串s,請你計算並返回將該字串分割成兩個子字串(即左子字串和右子字串, 子字串允許為空)所能獲得的最大得分。

已知分割字串的得分規則如下:

左子字串中:0得2分,1得1分

右子字串中:1得2分,0得1分

子字串為空則得0分

#include

using

namespace std;

intmain()

for(

int i =

0;i < str.

size()

;i++

) cur = i+1;

while

(cur < str.

size()

)if(sum > ret)

ret = sum;

} cout << ret

}

3.已知摩爾斯電碼和字元對映關係如下:

a -> 0

b -> 1

c -> 10

d -> 11

e -> 100

f -> 101

g -> 110

h -> 111

當前我們獲取到了一串01數字字串,需要進行摩爾斯電碼解碼,請問共有多少種解碼方法?

#include

#include

using

namespace std;

intmain()

if(i+

2< n)}}

cout<< dp[0]

}

4.大富翁遊戲規則如下

玩家起始會獲得一定資本m金幣

玩家每一次可以走乙個格,或者跳兩個格;走一格耗費2個金幣能量;跳兩個格,耗費3個金幣能量;金幣只有滿足能量消耗時,才能繼續往下走

玩家每走到乙個格,會得到這個格的獎勵,每個格的獎勵金幣數為非負整數

當玩家走到這個格後,總金幣數不足以支援下一步金幣消耗時,則不能繼續往下走,遊戲結束

玩家第一步可以選擇走一步進第1格或者跳2步進第2格起始,玩家可以選擇在任意一格結束遊戲

問玩家遊戲中,最多能得到多少個金幣?

#include

#include

using

namespace std;

intmain()

int ret =0;

vector<

int>

dp(nums.

size()

+1,0

);dp[0]

= sum;

for(

int i =

1;i <= nums.

size()

;i++

)//nums的下標比dp的下標小1

if(i-

2>=

0&&dp[i-2]

>=3)

ret =

max(ret, dp[i]);

} cout << ret;

return0;

}

5.網易嚴選建有n個自營倉分布在全國各地,標記為倉庫1到n。

給定乙個配貨時間組(v,u,w),v為出發倉庫,u為目標倉庫,w為從出發倉庫到目標倉庫的耗時時間。可能存在倉庫間過遠,無法支援調撥轉貨。

指定乙個出發倉庫k,我們需要將**商傳送到k倉庫的貨配送到各個倉庫。問配送到所有可到達倉庫所要最短時間?如果無法全部調撥到,則返回-1.

python3

def solution

(start, graph, n)

: passed =

[start]

nopass =

[x for x in range(1

, n +1)

if x != start]

dis = graph[start]

while

len(nopass)

: idx = nopass[0]

# 選出距離起點最近的點

for i in nopass:

if dis[i]

< dis[idx]

: idx = i

nopass.

remove

(idx)

passed.

(idx)

# 更新距離

for i in nopass:

if dis[i]

> dis[idx]

+ graph[idx]

[i]:

dis[i]

= dis[idx]

+ graph[idx]

[i]return

max(dis[1:

])ifmax

(dis[1:

])!=float

("inf"

)else-1

n, k, m =

input()

.strip()

.split

(' '

)n, k, m =

int(n)

,int

(k),

int(m)

graph =[[

float

("inf")]

*(n +1)

for _ in range

(n +1)

]for i in range

(n +1)

: graph[i]

[i]=

0for _ in range

(m):

s, t, d =

input()

.strip()

.split

(' '

) s, t, d =

int(s)

,int

(t),

int(d)

graph[s]

[t]=

min(d, graph[s]

[t])

print

(solution

(k, graph, n)

)

iOS程式設計 學習篇(四)

從語法上看,類方法的宣告和例項方法的宣告不同,差別在於第乙個字元。在返回型別的前面,例項方法使用的是字元 而類方法使用的是字元 tips 標頭檔案宣告順序 例項變數宣告應該寫在最前面,然後是類檔案,接下來是初始化方法,最後是其他方法。這種排序是一種約定。instancetype randomitem...

python核心程式設計學習(四)

乙個計算簡單加減法的例子 created on 2012 3 7 author administrator usr bin env python from operator import add,sub from random import randint,choice ops maxtries 2...

Python程式設計學習筆記(四)

a 3b 4print a b 7print b a 1print a b 12 print b a 1.33333333333 print b a 1print b a 1print a b 81 x 6x 3print x 9 x 6x 3print x 3 x 6x 3print x 18 x...