數字操作題目彙總

2022-06-22 14:57:11 字數 4281 閱讀 9097

7、整數反**

給出乙個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。

示例 1:

輸入: 123

輸出: 321

示例 2:

輸入: -123

輸出: -321

示例 3:

輸入: 120

輸出: 21

思路:假設我們的環境只能儲存 32 位有符號整數,其數值範圍是 [−2^31, 2^31 − 1]。

根據這個假設,如果反轉後的整數溢位,則返回 0。

先判斷正負,然後看在反轉過程中會不會越界,越界則返回0;

注意:判斷時用除法而不用乘法是為了避免溢位發生;

class solution 

//若構成死迴圈,則返回false

if(recordn.find(sum) != recordn.end())

return false;

n = sum;

}return true;

}};

8. 字串轉換整數 (atoi)

請你來實現乙個atoi函式,使其能將字串轉換成整數。

首先,該函式會根據需要丟棄無用的開頭空格字元,直到尋找到第乙個非空格的字元為止。接下來的轉化規則如下:

注意:假如該字串中的第乙個非空格字元不是乙個有效整數字元、字串為空或字串僅包含空白字元時,則你的函式不需要進行轉換,即無法進行有效轉換。

在任何情況下,若函式不能進行有效的轉換時,請返回 0 。

假設我們的環境只能儲存 32 位大小的有符號整數,那麼其數值範圍為 [−231,  231 − 1]。如果數值超過這個範圍,請返回  int_max (231 − 1) 或 int_min (−231) 。

示例 1:

輸入: "42"

輸出: 42

示例 2:

輸入: "   -42"

輸出: -42

解釋: 第乙個非空白字元為 '-', 它是乙個負號。

我們盡可能將負號與後面所有連續出現的數字組合起來,最後得到 -42 。

示例 3:

輸入: "4193 with words"

輸出: 4193

解釋: 轉換截止於數字 '3' ,因為它的下乙個字元不為數字。

示例 4:

輸入: "words and 987"

輸出: 0

解釋: 第乙個非空字元是 'w', 但它不是數字或正、負號。

因此無法執行有效的轉換。

示例 5:

輸入: "-91283472332"

輸出: -2147483648

解釋: 數字 "-91283472332" 超過 32 位有符號整數範圍。

因此返回 int_min (−231) 。

思路:是否為空判斷,然後處理空格和正負號情況,然後遍歷數字,字元相減轉換成int

溢位的情況下,返回int_min或者int_max,最後判斷一下正負返回

class solution 

int i=0;

//跳過前面空格,判斷正負

while(s[i]==' ')

bool neg = false;

//對非空和非+-號的有效數字進行處理

if(s[i]=='-')else if(s[i]=='+')

long ans =0;

for(;i='0'&&s[i]<='9')

//碰到非有效數字就退出

else

}return neg?-ans:ans;

}};

9. 回文數

判斷乙個整數是否是回文數。回文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。

示例 1:

輸入: 121

輸出: true

示例 2:

輸入: -121

輸出: false

解釋: 從左向右讀, 為 -121 。 從右向左讀, 為 121- 。因此它不是乙個回文數。

示例 3:

輸入: 10

輸出: false

解釋: 從右向左讀, 為 01 。因此它不是乙個回文數。

思路:反轉數字後判斷兩個數是不是相等,需要注意資料反轉後溢位的情況,所以將反轉後的型別定義為long

或者,輸入數字轉化為字串。回文數關於中心對稱,只需比較對稱的數是否相等即可

class solution 

int num=x;

long res = 0;

while(x)

cout<43. 字串相乘

給定兩個以字串形式表示的非負整數 num1 和 num2,返回 num1 和 num2 的乘積,它們的乘積也表示為字串形式。

示例 1:

輸入: num1 = "2", num2 = "3"

輸出: "6"

示例 2:

輸入: num1 = "123", num2 = "456"

輸出: "56088"

說明:num1 和 num2 的長度小於110。

num1 和 num2 只包含數字 0-9。

num1 和 num2 均不以零開頭,除非是數字 0 本身。

不能使用任何標準庫的大數型別(比如 biginteger)或直接將輸入轉換為整數來處理。

思路:①m位數乘以n位數的結果,最長為m+n位。

②在計算機中,以string標示的數字,下標i乘以下標j的結果,理應放在下標(i+j)處。

但是,考慮到進製,需要留一位固定的answer[0]給最高位進製的數字。

於是(i,j)乘積的臨時結果temp的實際下標應該為answer[i+j+1]。

注意,要從個位開始乘法累加,在string中是從str[str.size()-1]開始到str[0]結束。

③在①中可以證明,m位乘n位結果最多m+n位,因此我們申請m+n位的陣列,下標最大值為m+n-1。

在②中顯然,下標i<=m-1,下標j<=n-1,則下標i+j+1<=m+n-1,恰好為陣列下標的最大值。

從兩個方向獲得的上界吻合,所申請空間的利用率為100%。

模擬正常算乘法的步驟就可以,需要注意最後結果的第乙個字元不能為『0』。

class solution

str[i] += mulflag + addflag;

}if (str[0] == '0')

str = str.substr(1, str.size());

return str;

}};

172. 階乘後的零

給定乙個整數 n,返回 n! 結果尾數中零的數量。

示例 1:

輸入: 3

輸出: 0

解釋: 3! = 6, 尾數中沒有零。

示例 2:

輸入: 5

輸出: 1

解釋: 5! = 120, 尾數中有 1 個零.

說明: 你演算法的時間複雜度應為 o(log n) 。

思路:階乘後的零是因為5乘以乙個偶數的結果,所以5的個數,決定了階乘後零的個數。

但是怎樣檢視階乘中5的個數呢,要根據因式分子

例如n=30,30!=1*2*3*4*5*6*7*8*9*10*...*30;

裡面有多少個為5的因式分子的,先看裡面有多少個元素可以整除5,

有5,10,15,20,25,30共6個這個6是怎麼求出來的呢?6=30/5;

然後在這六個元素裡分別提取分式因子5,可以提取出六個,提取後變成1,2,3,4,5,6,然後看這六個裡面有多少個元素可以整除5,6/5=1,

所以有乙個元素5還可以繼續提取出乙個因式分子5,這樣就可以看出30!中總共包括7個因式分子5.,所以有7個零

class solution 

return num;

}};

258. 各位相加

給定乙個非負整數 num,反覆將各個位上的數字相加,直到結果為一位數。

示例:輸入: 38

輸出: 2

解釋: 各位相加的過程為:3 + 8 = 11, 1 + 1 = 2。 由於 2 是一位數,所以返回 2。

高階:你可以不使用迴圈或者遞迴,且在 o(1) 時間複雜度內解決這個問題嗎?

思路:常規方法,每位數字相加,如果和小於10,則直接返回,否則將和繼續按位求和,直到滿足條件

class solution 

if(num==0&&sum<10)

}res= sum;

return res;

}};

PV操作 題目解析 (贊)

感覺概念理解的差不多了,試著做一兩道題,來看看是否真的明白,以及還有什麼地方不明白的.下面都是軟考真題,之前看它的時候,我是一點也不會,只巴望著我軟考的時候不要考啊.現在我看看有沒有一點點思路.首先靜下心來,告訴自己,全都很簡單,沒什麼難的,我都會.沒錯,我都會.很好,開始看題分析.分析題,首先,有...

數字ic筆試面試 題目彙總

1 fpga資源 問你用的哪些fpga,你用的那款fpga的dsp片數,佔了多少資源,響應時間多少 2 專案相關 讓你畫專案的結構框圖,系統框架 3 濾波器設計 4 fpga裡面的slice,為什麼要用ram,資源優化,時序約束,建立時間,chipscope除錯時,取樣率的設定。5 axi協議,問u...

作業系統 基礎題目彙總二

1 在作業系統中,可以並行工作的基本單位是 正確答案 c a 作業 b 程式 c 程序 d 過程 2 bmp是24bit的,那麼一張512 1024點的是多大?正確答案 a a 1.5m b 12m c 1m d 2m 24bit意思是用24bit來表示每乙個畫素點的顏色,那麼1個點需要3b 紅藍綠...