@
- 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;
}