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