目录
1.剑指Offer
面试题24:反转链表
题目描述:输入一个链表,反转链表后,输出新链表的表头。
思路:考虑代码鲁棒性
代码:
//迭代
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
ListNode* ReverseNode=nullptr;
ListNode* pPrev=nullptr;
ListNode* pNode=pHead;
while(pNode!=nullptr){
ListNode* pNext=pNode->next;
if(pNext==nullptr){
ReverseNode=pNode;
}
pNode->next=pPrev;
pPrev=pNode;
pNode=pNext;
}
return ReverseNode;
}
};
//递归
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(head==nullptr||head->next==nullptr){
return head;
}
ListNode* p=reverseList(head->next);
head->next->next=head;
head->next=nullptr;
return p;
}
};
面试题25:合并两个排序链表
题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
思路:递归实现
代码:
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if(pHead1==nullptr){
return pHead2;
}
if(pHead2==nullptr){
return pHead1;
}
ListNode* MergeHead=nullptr;
if(pHead1->val<=pHead2->val){
MergeHead=pHead1;
MergeHead->next=Merge(pHead1->next,pHead2);
}
else{
MergeHead=pHead2;
MergeHead->next=Merge(pHead1,pHead2->next);
}
return MergeHead;
}
};
2.华为机试题
例1:字符串运用-密码截取
题目描述
Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化 ABBA->12ABBA,ABA->ABAKK,123321->51233214 。因为截获的串太长了,而且存在多种可能的情况(abaaab可看作是aba,或baaab的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的有效密码串吗?
输入描述:
输入一个字符串
输出描述:
返回有效密码串的最大长度
示例1
输入
ABBA
输出
4
思路:动态规划
代码:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main(){
string s;
while(cin>>s){
int n=s.length();
int max=0;
vector<vector<bool>> dp(n,vector<bool>(n,false));
for(int i=0;i<n;i++){
for(int j=0;j<=i;j++){
if(i==j){
dp[j][i]=true;
}
else if(i-j==1){
dp[j][i]=(s[j]==s[i]);
}
else{
dp[j][i]=(s[j]==s[i]&&dp[j+1][i-1]);
}
if(dp[j][i]&&max<i-j+1){
max=i-j+1;
}
}
}
cout << max << endl;
}
return 0;
}
例2:整数和IP地址间的转换
题目描述:
原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成
一个长整数。
举例:一个ip地址为10.0.3.193
每段数字 相对应的二进制数
10 00001010
0 00000000
3 00000011
193 11000001
组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。每段可以看成是一个0-255的整数,需要对IP地址进行校验
输入描述:
输入 1 输入IP地址 2 输入10进制型的IP地址
输出描述:
输出
1 输出转换成10进制的IP地址
2 输出转换后的IP地址
示例1
输入
10.0.3.193 167969729
输出
167773121 10.3.3.193
思路:位与和移位操作
代码:
#include <iostream>
#include <string>
using namespace std;
int main(){
unsigned int a,b,c,d; //必须是无符号整数,否则会越界
char ch;
while(cin>>a>>ch>>b>>ch>>c>>ch>>d){
cout<<((a<<24)|(b<<16)|(c<<8)|d)<<endl;
cin>>a;
cout<<((a&0xff000000)>>24)<<"."<<((a&0x00ff0000)>>16)<<"."<<((a&0x0000ff00)>>8)<<"."<<((a&0x000000ff))<<endl;
}
return 0;
}
例3:图片整理
题目描述:
Lily上课时使用字母数字图片教小朋友们学习英语单词,每次都需要把这些图片按照大小(ASCII码值从小到大)排列收好。请大家给Lily帮忙,通过C语言解决。
输入描述:
Lily使用的图片包括"A"到"Z"、"a"到"z"、"0"到"9"。输入字母或数字个数不超过1024。
输出描述:
Lily的所有图片按照从小到大的顺序输出
示例1
输入
Ihave1nose2hands10fingers
输出
0112Iaadeeefghhinnnorsssv
代码:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main(){
string data;
while(cin>>data){
sort(data.begin(),data.end());
cout << data << endl;
}
return 0;
}
例4:蛇形矩阵
题目描述:
题目说明
蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。
样例输入
5
样例输出
1 3 6 10 15
2 5 9 14
4 8 13
7 12
11
接口说明
原型
void GetResult(int Num, char * pResult);
输入参数:
int Num:输入的正整数N
输出参数:
int * pResult:指向存放蛇形矩阵的字符串指针
指针指向的内存区域保证有效
返回值:
void
输入描述:
输入正整数N(N不大于100)
输出描述:
输出一个N行的蛇形矩阵。
示例1
输入
4
输出
1 3 6 10 2 5 9 4 8 7
思路:分析数字规律
代码:
#include <iostream>
using namespace std;
int main(){
int n;
while(cin>>n){
int beg=1;
for(int i=1;i<=n;i++){
cout<<beg;
int tmp=beg;
for(int j=i+1;j<=n;j++){
tmp+=j;
cout<<" "<<tmp;
}
cout<<endl;
beg+=i;
}
}
return 0;
}