11.数字颠倒
方法一:直接利用C++库函数,先将数字转换成字符串,然后再颠倒过来即可,朴实无华的思想2333
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main() {
int input;
cin >> input;
string str = to_string(input);
reverse(str.begin(), str.end());
cout << str << endl;
return 0;
}
方法二:
#include<iostream>
#include<string>
using namespace std;
int main() {
int input;
cin >> input;
string str;
if (input == 0) {//输入是0的情况单独判断
cout << 0 << endl;
}
else {
while (input) {
str = input % 10 + '0';//“末尾”为0的时候要加上'0'字符
cout << str;
input /= 10;
}
}
return 0;
}
12.字符串反转
方法一:和上一题一样,直接利用库函数:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main(){
string str;
cin>>str;
reverse(str.begin(),str.end());
cout<<str;
return 0;
}
方法二:直接从后往前输出就行了呗!
#include <iostream>
#include <string>
using namespace std;
int main(){
string str;
cin >> str;
for(int i = str.size()-1; i >=0;i--)
cout << str[i];
}
13.句子逆序
方法一:利用输入流输出流的小技巧:
#include <iostream>
#include <string>
using namespace std;
int main() {
string input, output;
while (cin >> input) {
output = input + ' ' + output;
}
cout << output << endl;
return 0;
}
方法二:逆序扫描,保存每个单词,遇到空格就输出前面的单词:
#include<iostream>
#include<string>
using namespace std;
int main(){
string s;
while(getline(cin,s)){
int n=s.size();
string tmp;
for(int i=n-1;i>=0;i--){
if(s[i]!=' ')
tmp=s[i]+tmp;
else{
cout<<tmp;
cout<<' ';
tmp.clear();
}
}
cout<<tmp<<endl;
}
}
方法三:用reverse两次反转,亦即先整体反转再局部反转:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main(){
string s;
while(getline(cin,s)){
reverse(s.begin(),s.end());
string::iterator left=s.begin();
for(string::iterator itr=s.begin();itr!=s.end()+1;++itr){
if(itr==s.end()||*itr==' '){
reverse(left,itr);
left=itr+1;
}
}
cout<<s<<endl;
}
}
14.字符串的连接最长路径查找
直接利用库函数,排序后输出即可:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
int input;
while(cin>>input){
string str;
vector<string>strs;
while(input--){
cin>>str;
strs.push_back(str);//接收字符串
}
sort(strs.begin(),strs.end());//排序
for(int i=0;i<strs.size();i++){//输出
cout<<strs[i]<<endl;
}
}
return 0;
}
15.求int型正整数在内存中存储时1的个数
牛客网剑指offer题目的第11题,具体解法参考我的这篇博客。
方法一:从右往左移位对比。
#include <iostream>
using namespace std;
int main(){
int input,count=0;
unsigned int flag=1;
cin>>input;
while(flag){
if(input&flag){
count++;
}
flag=flag<<1;
}
cout<<count<<endl;
return 0;
}
方法二:比较巧妙的方法
#include <iostream>
using namespace std;
int main(){
int input,count=0;
cin>>input;
while(input){
count++;
input=(input-1)&input;
}
cout<<count<<endl;
return 0;
}
16.购物单
背包问题。暂时没想到解法。等以后来填坑。
17.坐标移动
#include<iostream>
#include<string>
using namespace std;
int main() {
string str;
while (cin >> str) {
pair<int, int> point(0, 0);//point.first point.second
size_t found = str.find_first_of(';'); //找到第一个';'的位置
int start = 0;
while (found != string::npos) {
string s1 = str.substr(start, found - start);
start = found + 1;
found = str.find_first_of(';', found + 1);
if (s1.size() > 1 && s1.size() <= 3) { //合法的字符个数:2或3
char c = s1[0];
int n = 0;
int invalid = 0; //数字为是否非法
for (int i = 1; i < s1.size(); ++i) { //数字位判断与提取,A1A
if (s1[i] >= '0' && s1[i] <= '9')
n = n * 10 + (s1[i] - '0');
else {
invalid = 1;
break;
}
}
if (invalid == 0) {
switch (c) {
case 'A': {point.first -= n; break; }
case 'D': {point.first += n; break; }
case 'W': {point.second += n; break; }
case 'S': {point.second -= n; break; }
}
}
}
}
cout << point.first << ',' << point.second << endl;
}
return 0;
}
18.识别有效的IP地址和掩码并进行分类统计
这题可以算是一个小程序了,复杂量上来了,等以后来施工!
19.简单错误记录
待施工!
20.验证密码合格程序
思路其实不难,注意点就是几个条件分函数写,纯粹考察代码能力:
#include<iostream>
#include<string>
using namespace std;
bool checkchar(string str)//包括大小写字母.数字.其它符号,以上四种至少三种
{
int i0 = 0, i1 = 0, i2 = 0, i3 = 0;
for (int i = 0; i < str.size(); i++) {
if (str[i] >= 'a' && str[i] <= 'z') {
i0 = 1;
}
else if (str[i] >= 'A' && str[i] <= 'Z') {
i1 = 1;
}
else if (str[i] >= '0' && str[i] <= '9') {
i2 = 1;
}
else {
i3 = 1;
}
}
if (i0 + i1 + i2 + i3 >= 3) {
return true;
}
else {
return false;
}
}
bool checksubstr(string str) {
int len = str.size();
for (int i = 0; i < len - 3; i++) {
string s = str.substr(i, 3);
if (str.find(s, i + 3) != str.npos){ //找到重复
return false;
}
}
return true;
}
int main() {
string str;
while (cin >> str) { //循环处理
if (str.size() > 8 && checksubstr(str) && checkchar(str)) {
cout << "OK" << endl;
}
else {
cout << "NG" << endl;
}
}
return 0;
}