算法营day8

牛客 回文数索引

题目描述
给定一个仅由小写字母组成的字符串。现在请找出一个位置,删掉那个字母之后,字符串变成回文。请放心总会有一个合法的解。如果给定的字符串已经是一个回文串,那么输出-1。

思路:
回文数字就是从前读和从后读,所得到的顺序是一样的。

  1. 判断字符串,已经是回文的话,那么直接输出-1
  2. 不是回文的话,去掉end,再检测。是回文的话,输出end
  3. 否则输出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层序遍历的实现,记录每一层的成熟即可
代码:

在这里插入代码片

牛客 两个链表的第一个公共节点

题目描述
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)

思路:
代码:
链表常见题型

猜你喜欢

转载自blog.csdn.net/qq_35353824/article/details/107610500