@
- 1、把一個整數倒序
- 2、判斷字符串是不是回文串
- 3、字符串和整型,浮點型的相互轉換 to_string()、stoi()、stof()
- 4、找出源字符串中有多少個目標字符,如在"the food is delicious" 找出有多少個'i' ,答案3個
- 5、判斷一個小字符串str_small是否是另一個大字符串str_big的子串。
- 6、字符串中字符變為大寫,小寫
- 7、判斷一個數是不是2的冪次
- 8、那么怎么求得一個是2的冪次的數究竟是2的多少次方呢
- 9、判斷一個整型數的二進制表示有多少個1
- 10、消去二進制數的最后一位,比如1000—>0000, 1001—>1000, 0110—>0100。和上面的判斷有幾個1的有關
- 11、刪除字符串的最后n個字符的三種方法。
- 12、1到n的所有數的約數個數之和
- 13、兩個字符串數字相加
- 14、字符串數字與字符數字相乘
1、把一個整數倒序
int reverseInt( int num ){
int r = 0;
while (num > 0) {
r = r*10 + num % 10;
num = num / 10;
}
return r;
}
用處:可以判斷是否是回文數(且要求不能把數字轉為字符串的情況下),直接判斷倒序前后數值是否相等即可。
2、判斷字符串是不是回文串
bool judgePalindrome(char* str, int len) { // 判斷第 i 個字符是否和倒數第 i 個字符相等
for (int i = 0; i < len / 2; i++) { //用len/2(一個整數且丟棄小數部分)之前不用判斷len是奇數還是偶數,偶數不用說,奇數的話最中間的一個字符不用比,所以len/2也是符合要求的。
if (str[i] != str[len - 1 - i]) { //已經有不同的了,直接返回false。
return false;
}
}
return true; //如果都相同,那么是回文串。
}
char* str也可以換成 string str,我是從c那邊直接移過來的,其實應該更多使用string類型
3、字符串和整型,浮點型的相互轉換 to_string()、stoi()、stof()
#include <iostream>
#include <string>
using std::cout;
using std::cin;
using std::endl;
using std::string;
using std::to_string;
int main()
{
int i = 1254,di;
float t = 114.324,dt;
string fi = to_string(i),ft= to_string(t); //to_string()函數把數值類型轉換為字符串。
di = stoi(fi); //stoi()是字符串轉整型
dt = stof(ft); //stof()是字符串轉浮點型
cout << fi << endl;
cout << ft << endl;
cout << di << endl;
cout << dt << endl;
}
現在判斷整型數是不是回文數。也可以先吧整型數轉成字符串再利用判斷字符串函數來判斷是否是回文串
4、找出源字符串中有多少個目標字符,如在"the food is delicious" 找出有多少個'i' ,答案3個
//source 是源字符串,len是源字符串長度len=source.length()。targetChar是要找的目標字符
int findCharNumber(string source, int len, char targetChar) {
int num = 0;
for (int i = 0; i < len; i++) {
if (source[i] == targetChar) {
num++;
}
}
return num;
}
調用示例
string str_big = "the food is delicious";
int num = findCharNumber(str_big, str_big.length(),'i');
當然,也可以用stl算法里面的count()函數; 函數參數意義可自行百度,使用時可參照如下代碼。注意:必須先包括頭文件 include <algorithm>
string str_big = "the food is delicious";
int num1 = count(str_big.begin(), str_big.end(), 'i');
5、判斷一個小字符串str_small是否是另一個大字符串str_big的子串。
如 “hello” 是 “hello world” 的子串,注意: “llo” 也是 “hello world” 的子串。函數是str_big.find(str_small),如果是則返回targetString第一個字符在str_big中的下標,不是則返回string::npos,npos 為大於最大有效下標的值
string str_big = "the food is delicious";
string str_small = "lici";
string::size_type idx = str_big.find(str_small); //str_big.find(str_small) 代表從str_big 的所有子串中查找與 str_small匹配的,
//找到則返回str_small第一個字符在str_big中的下標,找不到則返回string::npos
string t = ((idx != string::npos) ? "yes" : "no"); //string::npos 是一個特殊值,npos 為大於最大有效下標的值
cout << str_small << "是"<< str_big << "的子串? "<< t<<endl;
find()函數介紹 c++里面的find()和erase()
6、字符串中字符變為大寫,小寫
string st("hello world");
for (string::size_type index = 0; index != st.size(); ++index) {
st[index] = toupper(st[index]); //把小寫轉換為大寫,如果本身是大寫,則不變
}
cout << "轉換為大寫 :" << st << endl;
for (string::size_type index = 0; index != st.size(); ++index) {
st[index] = tolower(st[index]); //把大寫轉換為小寫,如果本身是小寫,則不變
}
cout << "又轉換為小寫 :" << st << endl;
cout << "用到的頭文件是 : cctype" << endl; //用到的頭文件是 : cctype
7、判斷一個數是不是2的冪次
if (num & (num - 1)) { //num & (num - 1)=0,則代表num是2的冪次方,
cout << num << "不是2的冪次方" << endl;
}
else {
cout << num << "是2的冪次方" << endl;
}
這個東西可以用來做 判斷給定的整數num(num>=3)能否表示成連續的m(m > 1)個正整數之和這個問題,如15就可以表示成連續的m個正整數之和。
15=1+2+3+4+5
15=4+5+6
15=7+8
這個問題等價於判斷 num 是不是2的冪次,這兒不展開,放到另一篇博客里面 題目:判斷給定的整數num(num>=3)能否表示成連續的m(m > 1)個正整數之和。
8、那么怎么求得一個是2的冪次的數究竟是2的多少次方呢
int log2(int value) //遞歸判斷value是2的多少次方
{
if (value == 1)
return 0;
else
return (1 + log2(value >> 1));
}
9、判斷一個整型數的二進制表示有多少個1
int CountOfOneInBinaryNumber(int num) {
int count = 0;
while (num) {
num &= (num - 1);
count++;
}
return count;
}
10、消去二進制數的最后一位,比如1000—>0000, 1001—>1000, 0110—>0100。和上面的判斷有幾個1的有關
num &= (num - 1);
11、刪除字符串的最后n個字符的三種方法。
如“123456”中刪除56,那么n=2。只刪除6,n=1。
temp = temp.substr(0, temp.length() - n); //第一種方法,但不能用這種方法只刪除5
temp.erase(temp.end() - n,temp.end()); //第二種方法
for(int i=0; i<n; i++){ //第三種方法,只能從后往前刪
temp.pop_back();
}
能用erase()函數只刪除5 , 具體看這篇erase()函數介紹 c++里面的find()和erase()
12、1到n的所有數的約數個數之和
int OneToNumGcdCount(int num) {
int ans = 0;
for (int i = 1; i <= num; i++) {
ans += num / i;
}
return ans;
}
至於為什么這個設計就可以。看這兒——> 點我點我
13、兩個字符串數字相加
原意:兩個數字是以字符型(長度可達5000)給出的,如:a=12345,b=98765432,求a+b。數據保證了不會是0開頭(換句話說,這個字符串數字是合法的),這個問題要求我們用字符串來解決。
string addStrings(string num1, string num2) {
string str;
int cur = 0, i = num1.size()-1, j = num2.size()-1;
//從字符串的末尾(我們數字的個位)開始加,直到加到最高位加完
while (i >= 0 || j >= 0 || cur != 0) { //判斷是否加完,其實根據||的計算方式,cur!=0只會在把兩個字符串的元素遍歷完才會判斷。一般來講只有兩個字符串相等且加了有進位的才會判斷到這兒
if (i >= 0) cur += num1[i--] - '0'; //判斷字符串1是否所有元素加完
if (j >= 0) cur += num2[j--] - '0'; //判斷字符串2是否所有元素加完
str += to_string (cur % 10); //取低位變成字符加到字符串中
cur /= 10; //判斷有無進位
}
reverse(str.begin(), str.end()); //把字符串倒置
return str;
}
一樣的思路判斷條件,只要把最高位都判斷加完了而且最高位加完后沒有進位,那整個過程就結束了。道理和剛才是一樣的。
string addStrings(string num1, string num2) {
string str;
int cur = 0, i = num1.size()-1, j = num2.size()-1;
int maxLength=i>j?i:j;
while (maxLength>=0 || cur != 0) {
if (i >= 0) cur += num1[i--] - '0';
if (j >= 0) cur += num2[j--] - '0';
str += to_string (cur % 10);
cur /= 10;
maxLength--;
}
reverse(str.begin(), str.end());
return str;
}
14、字符串數字與字符數字相乘
計算一個字符串和一個字符數字的乘積,返回字符串。舉例:輸入為 "123", 3, 返回"369"
string StringMultiplyDigit(string str, char n) {
reverse(str.begin(), str.end());
string res="" ;
int digit1 = n - '0', carry = 0, digit2 = 0, product = 0;
for (int i = 0; i < str.size(); i++) {
digit2 = str[i] - '0';
product = digit1 * digit2 + carry;
res = res + to_string(product % 10);
carry = product / 10;
}
if (carry) {
res = res + to_string(carry);
}
reverse(res.begin(), res.end());
return res;
}