概述
目录
Day46-学习内容:
1.剑指Offer
面试题22:链表中倒数第k个节点
面试题23:链表中环的入口节点
2.Leetcode
例1:链表的中间节点
3.华为机试题
例1:单词倒排
例2:字符串加解密
例3:字符串合并处理
1.剑指Offer
面试题22:链表中倒数第k个节点
题目描述:输入一个链表,输出该链表中倒数第k个结点。
思路:两个指针
代码:
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if(pListHead==nullptr||k==0){
return nullptr;
}
ListNode* pFront=pListHead;
int i=0;
for(;i<k-1;i++){
if(pFront->next==nullptr){
return nullptr;
}
pFront=pFront->next;
}
ListNode* pbehind=pListHead;
while(pFront->next!=nullptr){
pFront=pFront->next;
pbehind=pbehind->next;
}
return pbehind;
}
};
面试题23:链表中环的入口节点
题目描述:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
思路:
1、设置快慢指针,假如有环,他们最后一定相遇。
2、两个指针分别从链表头和相遇点继续出发,每次走一步,最后一定相遇与环入口。
代码:
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
if(pHead==nullptr||(pHead!=nullptr&&pHead->next==nullptr)){
return nullptr;
}
ListNode* pFast=pHead;
ListNode* pSlow=pHead;
while(pFast!=nullptr&&pFast->next!=nullptr){
pFast=pFast->next->next;
pSlow=pSlow->next;
if(pFast==pSlow){
break;
}
}
if(pFast==nullptr||pFast->next==nullptr){
return nullptr;
}
pFast=pHead;
while(pFast!=pSlow){
pFast=pFast->next;
pSlow=pSlow->next;
}
return pFast;
}
};
2.Leetcode
例1:链表的中间节点
题目描述:
给定一个带有头结点 head
的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
提示:
- 给定链表的结点数介于
1
和100
之间。
思路:快慢指针
代码:
class Solution {
public:
ListNode* middleNode(ListNode* head) {
if(head==nullptr){
return nullptr;
}
ListNode* pFast=head;
ListNode* pSlow=head;
while(pFast!=nullptr&&pFast->next!=nullptr){
pFast=pFast->next->next;
pSlow=pSlow->next;
}
return pSlow;
}
};
3.华为机试题
例1:单词倒排
题目描述:
对字符串中的所有单词进行倒排。
说明:
1、每个单词是以26个大写或小写英文字母构成;
2、非构成单词的字符均视为单词间隔符;
3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;
4、每个单词最长20个字母;
输入描述:
输入一行以空格来分隔的句子
输出描述:
输出句子的逆序
示例1
输入
I am a student
输出
student a am I
代码:
不通过!!
#include <iostream>
#include <string>
using namespace std;
int main(){
string str;
while(getline(cin,str)){
int len=str.length();
string res;
int i=len-1;
while(str[i]==' '){
i--;
}
string tmp="";
for(;i>=0;i--){
if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z')){
tmp=str[i]+tmp;
}
else{
res+=tmp;
res+=' ';
tmp.clear();
}
}
res+=tmp;
cout << res << endl;
}
return 0;
}
您的代码已保存
格式错误:您的程序输出的格式不符合要求(比如空格和换行与要求不一致)
case通过率为90.00%
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main(){
string str;
while(getline(cin,str)){
int len=str.length();
vector<string> res;
res.clear();
string tmp="";
for(int i=0;i<len;i++){
if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z')){
tmp+=str[i];
}
else{
if(tmp.size()>0){
res.push_back(tmp);
tmp.clear();
}
}
}
if(tmp.size()>0){
res.push_back(tmp);
}
for(int i=res.size()-1;i>0;i--){
cout<< res[i] << ' ';
}
cout << res[0] << endl;
}
return 0;
}
注意输入输出的格式和首个字符串为空的情况!!
解析:
质数(prime number)又称素数,有无限个。
质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。
例2:字符串加解密
题目描述:
1、对输入的字符串进行加解密,并输出。
2加密方法为:
当内容是英文字母时则用该英文字母的后一个字母替换,同时字母变换大小写,如字母a时则替换为B;字母Z时则替换为a;
当内容是数字时则把该数字加1,如0替换1,1替换2,9替换0;
其他字符不做变化。
3、解密方法为加密的逆过程。
接口描述:
实现接口,每个接口实现1个基本操作:
void Encrypt (char aucPassword[], char aucResult[]):在该函数中实现字符串加密并输出
说明:
1、字符串以 结尾。
2、字符串最长100个字符。
int unEncrypt (char result[], char password[]):在该函数中实现字符串解密并输出
说明:
1、字符串以 结尾。
2、字符串最长100个字符。
输入描述:
输入说明
输入一串要加密的密码
输入一串加过密的密码
输出描述:
输出说明
输出加密后的字符
输出解密后的字符
示例1
输入
abcdefg BCDEFGH
输出
BCDEFGH
abcdefg
代码:
//直接在原字符串上变换
#include <iostream>
#include <string>
using namespace std;
void Encrypt(string str){
for(int i=0;i<str.size();i++){
if(str[i]>='a'&&str[i]<'z'){
str[i]=str[i]-'a'+'A'+1;
}
else if(str[i]=='z'){
str[i]='A';
}
else if(str[i]>='A'&&str[i]<'Z'){
str[i]=str[i]-'A'+'a'+1;
}
else if(str[i]=='Z'){
str[i]='a';
}
else if(str[i]>='0'&&str[i]<'9'){
str[i]=str[i]+1;
}
else if(str[i]=='9'){
str[i]='0';
}
}
cout << str << endl;
}
void unEncrypt(string str){
for(int i=0;i<str.size();i++){
if(str[i]>'a'&&str[i]<='z'){
str[i]=str[i]-'a'+'A'-1;
}
else if(str[i]=='a'){
str[i]='Z';
}
else if(str[i]>'A'&&str[i]<='Z'){
str[i]=str[i]-'A'+'a'-1;
}
else if(str[i]=='A'){
str[i]='z';
}
else if(str[i]>'0'&&str[i]<='9'){
str[i]=str[i]-1;
}
else if(str[i]=='0'){
str[i]='9';
}
}
cout << str << endl;
}
int main(){
string str1,str2;
while(cin>>str1>>str2){
Encrypt(str1);
unEncrypt(str2);
}
return 0;
}
#include<iostream>
#include<string>
using namespace std;
void Enpt(string s){
for(int i=0;i<s.size();i++){
if(s[i] >='a' && s[i]<='z'){
s[i] = (s[i]-'a'+1)%26+'A';
}
else if(s[i]>='A' && s[i]<='Z'){
s[i] =(s[i]-'A'+1)%26+'a';
}
else if(s[i]>='0' && s[i]<='9'){
s[i]= (s[i]-'0'+1)%10+'0';
}
}
cout<<s<<endl;
}
void unEnpt(string s){
for(int i=0;i<s.size();i++){
if(s[i] >='a' && s[i]<='z'){
s[i] = (s[i]-'a'+25)%26+'A';
}
else if(s[i]>='A' && s[i]<='Z'){
s[i] =(s[i]-'A'+25)%26+'a';
}
else if(s[i]>='0' && s[i]<='9'){
s[i]= (s[i]-'0'+9)%10+'0';
}
}
cout<<s<<endl;
}
int main(){
string s1,s2;
while(cin>>s1){
cin>>s2;
Enpt(s1);
unEnpt(s2);
}
return 0;
}
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const string helper1 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
const string helper2 = "BCDEFGHIJKLMNOPQRSTUVWXYZAbcdefghijklmnopqrstuvwxyza1234567890";
void Encrypt(string str){
string res;
for (int i = 0; i < str.size(); i++) {
res += helper2[helper1.find(str[i])];
}
cout << res << endl;
}
void unEncrypt(string str){
string res;
for (int i = 0; i < str.size(); i++) {
res += helper1[helper2.find(str[i])];
}
cout << res << endl;
}
int main(){
string str1, str2;
while(getline(cin, str1)){
getline(cin, str2);
Encrypt(str1);
unEncrypt(str2);
}
return 0;
}
收获:
1.可以直接对原有字符串变换,或是通过string res(str.size(),'