牛客 回文数索引
题目描述
给定一个仅由小写字母组成的字符串。现在请找出一个位置,删掉那个字母之后,字符串变成回文。请放心总会有一个合法的解。如果给定的字符串已经是一个回文串,那么输出-1。
思路:
回文数字就是从前读和从后读,所得到的顺序是一样的。
- 判断字符串,已经是回文的话,那么直接输出-1
- 不是回文的话,去掉end,再检测。是回文的话,输出end
- 否则输出begin
PS:这个题目还是不好理解
代码:
#include<iostream>
#include<string>
using namespace std;
bool Ispalindrome(string& s,int* start, int* end){
int i = 0;
int j = s.size()-1;
bool result = true;
while(i <= j){
if(s[i] != s[j]){
result = false;//注意这里是改变result的值
break;
}
i++,j--;
}
if(start != nullptr) *start = i;
if(end != nullptr) *end = j;
return result;
}
int main(){
int num = 0;
cin >> num;
while(num--){
string str;
cin >> str;
int start = 0;
int end = str.size() -1;
if(Ispalindrome(str, &start, &end)){
cout<< -1<<endl;
}
else{
str.erase(end, 1);
if(Ispalindrome(str, nullptr, nullptr)){
cout<<end<<endl;
}
else{
cout<<start<<endl;
}
}
}
}
牛客 把数组排成最小的数
题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
思路:
另类排序,需要定义一个新的仿函数。
代码:
class Solution {
public:
static bool cmp(int a, int b){
string A = "";
string B = "";
A += to_string(a);
A += to_string(b);
B += to_string(b);
B += to_string(a);
return A < B;
}
string PrintMinNumber(vector<int> numbers) {
string res ="";
sort(numbers.begin(), numbers.end(),cmp);
for(int i = 0;i<numbers.size();++i){
res += to_string(numbers[i]);
}
return res;
}
};
牛客 二叉树的深度
题目描述
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
思路:
递归,求左子树和右子树的最大值,然后+1,就是整个树的高度
代码:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
int TreeDepth(TreeNode* pRoot)
{
if(nullptr == pRoot)
return 0;
return 1 + max(TreeDepth(pRoot->left),TreeDepth(pRoot->right));
}
};
思路:
BFS层序遍历的实现,记录每一层的成熟即可
代码:
在这里插入代码片
牛客 两个链表的第一个公共节点
题目描述
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
思路:
代码:
链表常见题型