近期刷题。

Posted 小葵向前冲

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了近期刷题。相关的知识,希望对你有一定的参考价值。

包含min函数的栈

描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的 min 函数,输入操作时保证 pop、top 和 min 函数操作时,栈中一定有元素。

此栈包含的方法有:
push(value):将value压入栈中
pop():弹出栈顶元素
top():获取栈顶元素
min():获取栈中最小元素

class Solution 
public:
    stack<int> s1; //栈的push和 pop
    stack<int> s2; //用于存储最小的min
    void push(int value) 
        s1.push(value);
        
        if(s2.empty() || s2.top() > value)
            s2.push(value);
        else
            s2.push(s2.top());
    
    void pop() 
        s1.pop();
        s2.pop();
    
    int top() 
        return s1.top();
    
    int min() 
        return s2.top();
    
;

数组中出现次数超过一半的数字

描述
给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。

思路: 哈希表

class Solution 
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) 
        unordered_map<int, int> haxi;
        for(int i=0; i< numbers.size(); i++)
                haxi[numbers[i]] += 1;
         
        for(int i=0; i<numbers.size(); i++)
        
            if(haxi[numbers[i]] > numbers.size()/2)
                return numbers[i];
        
        return -1;
    
;

进制转换

十进制换其他进制

描述
给定一个十进制数 M ,以及需要转换的进制数 N 。将十进制数 M 转化为 N 进制数。

当 N 大于 10 以后, 应在结果中使用大写字母表示大于 10 的一位,如 ‘A’ 表示此位为 10 , ‘B’ 表示此位为 11 。

若 M 为负数,应在结果中保留负号。

class Solution 
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 进制转换
     * @param M int整型 给定整数
     * @param N int整型 转换到的进制
     * @return string字符串
     */
    string s = "0123456789ABCDEF";
    string solve(int M, int N) 
        // write code here
        if(M == 0)
            return "0";
        
        string res = "";
        bool flag  = false; //正负标记
        if(M < 0)
            flag = true;
            M = abs(M);
        
        while(M)
            res = s[M%N] + res;
            M /= N;
        
        if(flag)
            res = "-" + res;
        return res;
        
    
;

判断一个链表是否为回文结构

描述
给定一个链表,请判断该链表是否为回文结构。
回文是指该字符串正序逆序完全一致。

涉及知识点:

  • vector 反转
/**
 * struct ListNode 
 *	int val;
 *	struct ListNode *next;
 * ;
 */

class Solution 
public:
    /**
     * 
     * @param head ListNode类 the head
     * @return bool布尔型
     */
    bool isPail(ListNode* head) 
        // write code here
        vector<int> nums;
        while(head != NULL)
            nums.push_back(head->val);
            head = head->next;
        
        vector<int> rev = nums;
        reverse(rev.begin(), rev.end());
        for(int i=0; i<nums.size(); i++)
            if(nums[i] != rev[i])
                return false;
        
        return true;
    
;

不同路径的数目(一)

描述
一个机器人在m×n大小的地图的左上角(起点)。
机器人每次可以向下或向右移动。机器人要到达地图的右下角(终点)。
可以有多少种不同的路径从起点走到终点?

备注:m和n小于等于100,并保证计算结果在int范围内

递归、动态规划

class Solution 
public:
    /**
     * 
     * @param m int整型 
     * @param n int整型 
     * @return int整型
     */
    //递归
    int uniquePaths1(int m, int n) 
        // write code here
        if( m ==1 || n ==1)//矩阵只要有一条边为1,路径数就只有一种了
            return 1;
        return uniquePaths1(m-1, n) + uniquePaths1(m, n-1);//两个分支
    
    
    int uniquePaths(int m, int n) 
        // write code here
        //dp[i][j]表示大小为i*j的矩阵的路径数量
        vector<vector<int>> dp(m+1, vector<int>(n+1, 0));//dp定义,初始化为0
        for(int i=1; i <= m; i++)
            for(int j=1; j<=n; j++)
                //只有1行的时候,只有一种路径
                 if(i == 1)
                    dp[i][j] = 1;
                    continue;
                
                //只有1列的时候,只有一种路径
                if(j == 1)
                    dp[i][j] = 1;
                    continue;
                
                //路径数等于左方格子的路径数加上上方格子的路径数
                dp[i][j] = dp[i-1][j] + dp[i][j-1];
            
        
        return dp[m][n];
        
    

以上是关于近期刷题。的主要内容,如果未能解决你的问题,请参考以下文章

近期刷题。

近期的刷题

九度OJ刷题——1008:最短路径问题

LeetCode刷题--点滴记录015

LeetCode刷题-008字符串转为整数

刷题方法论