宜陽(yáng)縣網(wǎng)站建設(shè)怎么自己注冊(cè)網(wǎng)站平臺(tái)了
Leetcode
- Leetcode -405.數(shù)字轉(zhuǎn)換為十六進(jìn)制數(shù)
- Leetcode - 409.最長(zhǎng)回文串
Leetcode -405.數(shù)字轉(zhuǎn)換為十六進(jìn)制數(shù)
題目:給定一個(gè)整數(shù),編寫一個(gè)算法將這個(gè)數(shù)轉(zhuǎn)換為十六進(jìn)制數(shù)。對(duì)于負(fù)整數(shù),我們通常使用 補(bǔ)碼運(yùn)算 方法。
注意 :
十六進(jìn)制中所有字母(a - f)都必須是小寫。
十六進(jìn)制字符串中不能包含多余的前導(dǎo)零。如果要轉(zhuǎn)化的數(shù)為0,那么以單個(gè)字符’0’來(lái)表示;對(duì)于其他情況,十六進(jìn)制字符串中的第一個(gè)字符將不會(huì)是0字符。 給定的數(shù)確保在32位有符號(hào)整數(shù)范圍內(nèi)。
不能使用任何由庫(kù)提供的將數(shù)字直接轉(zhuǎn)換或格式化為十六進(jìn)制的方法。
示例 1:
輸入 :
26
輸出 :
“1a”
示例 2:
輸入 :
-1
輸出 :
“ffffffff”
我們的思路是將這個(gè)數(shù)num的二進(jìn)制轉(zhuǎn)換成十六進(jìn)制,num的二進(jìn)制中,每四位就會(huì)轉(zhuǎn)換為十六進(jìn)制的一位數(shù),所以每次我們用num按位與上0xf,即是15,因?yàn)?5的二進(jìn)制形式為 1111 ,按位與上0xf就能得到num二進(jìn)制的后四位,然后將按位與得到的數(shù)進(jìn)行判斷處理,放入數(shù)組中;最后將num向右移四位,進(jìn)行下一次循環(huán);
以26為例:
向右移四位后按位與如下圖,所以最終結(jié)果為 " 1a ";
char* toHex(int num){//開(kāi)辟9個(gè)char空間,因?yàn)檎偷氖M(jìn)制最長(zhǎng)的長(zhǎng)度為8,加上'\0'就9個(gè)char* nums = (char*)malloc(sizeof(char) * 9);//對(duì)于負(fù)數(shù),將它強(qiáng)轉(zhuǎn)成無(wú)符號(hào)數(shù)處理unsigned newnum = (unsigned int)num;int i = 0;//如果數(shù)組中只有一個(gè)0,就在0后面加上'\0',返回?cái)?shù)組if (num == 0){nums[0] = '0';nums[1] = '\0';return nums;}//當(dāng)這個(gè)數(shù)轉(zhuǎn)成無(wú)符號(hào)數(shù)之后不為0,進(jìn)入循環(huán)while (newnum > 0){//0xf即為15,15的二進(jìn)制為 1111 //即將這個(gè)數(shù)按位與上 1111 ,得到這個(gè)數(shù)的二進(jìn)制的后四位,存放到flag中//因?yàn)槎M(jìn)制表示的數(shù),每四位二進(jìn)制就表示一為十六進(jìn)制的數(shù)int flag = newnum & 0xf;//如果小于10,就將它轉(zhuǎn)成字符放到數(shù)組中,然后i++if (flag < 10){nums[i++] = flag + '0';}//如果大于等于10,先減去10,再加上字符a,使它轉(zhuǎn)換成十六進(jìn)制的字符else{nums[i++] = flag - 10 + 'a';}//然后將這個(gè)數(shù)向右移四位,判斷下一個(gè)十六進(jìn)制的位數(shù)newnum >>= 4;}//循環(huán)結(jié)束后在i處加上'\0'nums[i] = '\0';//最后將數(shù)組逆置,因?yàn)榉胚M(jìn)去的時(shí)候是這個(gè)數(shù)二進(jìn)制的尾部開(kāi)始放,所以讀的時(shí)候要倒過(guò)來(lái)讀int left = 0, right = i - 1;while (left < right){char tmp = nums[left];nums[left++] = nums[right];nums[right--] = tmp;}return nums;}
Leetcode - 409.最長(zhǎng)回文串
題目:給定一個(gè)包含大寫字母和小寫字母的字符串 s ,返回 通過(guò)這些字母構(gòu)造成的 最長(zhǎng)的回文串 。
在構(gòu)造過(guò)程中,請(qǐng)注意 區(qū)分大小寫 。比如 “Aa” 不能當(dāng)做一個(gè)回文字符串。
示例 1:
輸入:s = “abccccdd”
輸出 : 7
解釋 :
我們可以構(gòu)造的最長(zhǎng)的回文串是"dccaccd", 它的長(zhǎng)度是 7。
示例 2 :
輸入 : s = “a”
輸出 : 1
示例 3:
輸入 : s = “aaaaaccc”
輸出 : 7
我們的思路是,用一個(gè)hash數(shù)組記錄字符串中字符出現(xiàn)的次數(shù),count記錄回文串的長(zhǎng)度,只要某個(gè)字符出現(xiàn)了兩次,就證明可以構(gòu)成回文串,就將2加到count中,然后再將這個(gè)字符的位置置0;對(duì)于奇數(shù)個(gè)的字符,對(duì)于上述的處理之后,現(xiàn)在hash數(shù)組中的位置對(duì)應(yīng)的數(shù)值只能是0或者1,0的話不管,1的話只保留一個(gè),因?yàn)樵诨匚拇惺菍?duì)稱的,只能有一個(gè)奇數(shù)的字符;具體的代碼和注釋如下:
int longestPalindrome(char* s){//創(chuàng)建一個(gè)hash數(shù)組,長(zhǎng)度為58,因?yàn)樽址泻写笮懽帜傅淖址?#xff0c;從'A'到'z'一共就58個(gè)字符int hash[58] = { 0 };//count統(tǒng)計(jì)最長(zhǎng)的回文串int count = 0;//遍歷字符串,以字符作為hash數(shù)組的下標(biāo)記錄這個(gè)字符出現(xiàn)的次數(shù),每次出現(xiàn)就++//當(dāng)這個(gè)位置出現(xiàn)了兩次,證明可以構(gòu)成回文串,就使count加2,并將這個(gè)位置置0for (int i = 0; i < strlen(s); i++){hash[s[i] - 'A']++;if (hash[s[i] - 'A'] > 1){count += 2;hash[s[i] - 'A'] = 0;}}//遍歷以'A'到'z'作為hash數(shù)組的下標(biāo),現(xiàn)在它們的位置的數(shù)值只能是0或者1//奇數(shù)個(gè)的字符在回文串中只能出現(xiàn)一個(gè),所以其他奇數(shù)個(gè)的字符都不算入count中,用count += hash[i] - 1處理,本來(lái)hash[i]是1,減去1后就是0int flag = 0;for (int i = 0; i < 58; i++){if (hash[i] % 2){flag = 1;count += hash[i] - 1;}}//最后留下來(lái)的奇數(shù)個(gè)的字符算入count中if (flag)count++;//最后返回回文串長(zhǎng)度return count;}