解答
class Solution {
public:
vector<string> subdomainVisits(vector<string>& cpdomains) {
vector<string> result;
map<string,int> pair;
for(string str:cpdomains){
auto space=str.find(‘ ‘);
int temp=stoi(str.substr(0,space));
str=str.substr(space+1);
while(!str.empty()){
pair[str] += temp;
if(str.find(‘.‘)!=string::npos){
str=str.substr(str.find(‘.‘)+1);
}
else{
str.clear();
}
}
}
for(auto temp:pair){
result.push_back(to_string(temp.second)+‘ ‘+temp.first);
}
return result;
}
};
此题个人有思路,但无从下手,是参考他人解法后从而解出来的。
参考链接:https://leetcode.com/problems/subdomain-visit-count/discuss/129879/C++-O(sum-of-lengths-of-strings)-simple-Solution
笔记
- string类型中的find,substr成员函数的使用
- 字符串转整数函数stoi,整数转字符串函数to_string
函数学习
1. string::find 查找
参考C++ Primer 5th 9.5.3节
1. 函数原型,有四个重载版本
// 1
size_type find( CharT ch, size_type pos = 0 ) const;
// 2
size_type find( const basic_string& str, size_type pos = 0 ) const
// 3
size_type find( const CharT* s, size_type pos = 0 ) const;
// 4
size_type find( const CharT* s, size_type pos, size_type count ) const;
2. 解释
返回类型:是一个size_type类型,是一个整数,表示匹配位置的下标;如果没有找到,则会返回string::npos,这是一个确定值,类型是整数,初始值为-1
查找开始位置:即pos,在1,2,3中默认从开始查找
前三个版本解释:1。查找字符;2. 查找string类型字符串;3.查找C风格字符串
第四个版本解释:查找一个C风格字符串的前n个字符字符,同时开始查找位置pos需指定
3. 示例程序
/********************************************
*
* 程序作用:测试string类型中的find成员函数
*
* a11测试第一个重载版本,能够找到;
* a12测试第一个重载版本,但不能找到
* a21测试第二个重载版本,能够找到;
* a22测试第二个重载版本,但不能找到
* a3 测试第三个重载版本,但不能找到
* a4 测试第四个重载版本,能够找到
*
* 编 制 人:niaocaics
* 编制时间: 2018.5.23
* 联系邮箱:[email protected]
*
*/
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
int main() {
string s{ "Hello World" };
size_t a11 = s.find(‘ ‘),a12=s.find(‘ ‘,7);
size_t a21 = s.find("lo"),a22=s.find("lol");
const char * str = "lol";
size_t a3 = s.find(str);
size_t a4 = s.find(str,1,2);
cout << a11 << " " << a12 << endl << a21 << " " << a22
<< endl << a3 << endl << a4 << endl;
system("pause");
return 0;
}
输出结果:
环境:Visual Studio 2017
输出:
5 4294967295
3 4294967295
4294967295
3
由此可见,npos会返回-1,因为size_t是一个无符号整数,所以整数-1会被解析成最大数
2. string::substr 求子串
参考C++ Primer 5th 9.5.1节
1. 函数原型:
basic_string substr( size_type pos = 0,
size_type count = npos ) const;
2. 解释
pos代表开始位置,默认会从字符串开头开始;
count代表复制的字符数,默认为npos,但由于size_type是无符号整数,因此有符号的-1会被解析成最大数,即count=最大数即到字符串结尾
3. 示例程序
/****************************************************************
* 程序作用:测试string类型中的substr成员函数
*
* s1使用默认参数
* s2只对开始位置进行处理
* s3指定开始字符,和字符长度(在字符串范围内)
* s3指定开始字符,和字符长度(但大于在字符串原本长度)
*
* 编 制 人:niaocaics
* 编制时间: 2018.5.24
* 联系邮箱:[email protected]
*
*/
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
int main() {
string s = { "Hello World!" };
string s1 = s.substr();
string s2 = s.substr(6);
string s3 = s.substr(6, 3);
string s4 = s.substr(6, 100);
cout << s1 << endl << s2 << endl <<
s3 << endl << s4 << endl;
system("pause");
return 0;
}
输出结果:
环境:Visual Studio 2017
输出:
Hello World!
World!
Wor
World!
3 stoi 将字符串转化为整数
1 函数原型
int stoi( const std::string& str,
std::size_t* pos = 0, int base = 10 );
字符串有俩种选择,宽字符串wstring和一般string,
返回类型有三种,int;long;long long
2 解释
str是要转换的字符串,pos代表开始位置默认从字符串,base代表进制,默认十进制
3 示例程序
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
int main() {
string s = { "1234567" };
int a = stoi(s);
cout << a << endl;
system("pause");
return 0;
}
输出:1234567
4. to_string 把数转换成字符串(C++11)
std::string to_string( int value );
value可以是int,long,long long,unsigned int,unsigned long,unsigned long long,float,double,long double类型
2 解释
value是数字,返回一个字符串
3 示例程序
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
int main() {
int a1 = 23456;
float a2 = 3.1415;
string s1 = to_string(a1);
string s2 = to_string(a2);
cout << s1 << endl << s2 << endl;
system("pause");
return 0;
}
输出:
23456
3.141500
总结
此题暴露了我对库函数的不熟悉,以后要多了解库函数
原文地址:https://www.cnblogs.com/cs-niaocai/p/9085722.html