每日5题(2020/10/8)

给出两个链表如下所示:
A:        a1 → a2
                   ↘
                     c1 → c2 → c3
                   ↗            
B:     b1 → b2 → b3

输出第一个公共节点c1
两个链表的第一和节点
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *findFirstCommonNode(ListNode *headA, ListNode *headB) {
        //方法一:双指针法
     /*   int lenA=0,lenB=0;
        struct ListNode * p=headA;
        struct ListNode * q=headB;
        while(p){
            p=p->next;
            lenA++;
        }
        while(q){
            q=q->next;
            lenB++;
        }
        p=headA;q=headB;
        if(lenA>lenB){
            for(int i=0;i<lenA-lenB;i++){
                p=p->next;
            }
            while(p){
                if(p->val==q->val){return q;}
                p=p->next;
                q=q->next;
            }
        }else{
            for(int i=0;i<lenB-lenA;i++){
                q=q->next;
            }
            while(p){
                if(p->val==q->val){return q;}
                p=p->next;
                q=q->next;
            }
        }
        return NULL;
        */
        //方式二:标记法
        struct ListNode * flag=new ListNode(-1);
        struct ListNode * p=headA;//遍历A链表,将所有的节点指向标记
        while(p){
            struct ListNode * tmp=p->next;
            p->next=flag;
            p=tmp;
        }
        struct ListNode * q=headB;
        while(q){
            if(q->next==flag){
                return q;
            }else{
                 q=q->next;
            }
        }
        return NULL;
    }
};

(2)

将一个骰子投掷n次,获得的总点数为s,s的可能范围为n~6n。

掷出某一点数,可能有多种掷法,例如投掷2次,掷出3点,共有[1,2],[2,1]两种掷法。

请求出投掷n次,掷出n~6n点分别有多少种掷法

class Solution {
public:
    vector<int> numberOfDice(int n) {
        //暴力搜索《dfs
        //dfs(n,s)=dfs(n-1,s-1)+dfs(n-1,s-2)+dfs(n-1,s-3)+dfs(n-1,s-4)+dfs(n-1,s-5)+dfs(n-1,s-6)
      /*  vector<int>res;
        for(int i=n;i<=6*n;i++){
            res.push_back(dfs(n,i));
        }
        return res;*/
        
        vector<int> res;
        vector<vector<int> > f(n+1, vector<int> (n * 6+1));
        f[0][0] = 1;
        for(int i = 1; i <= n; i ++)
            for(int j = i; j <= i * 6; j ++)
                for(int k = 1; k <= min(j, 6); k ++)
                    f[i][j] += f[i - 1][j - k];
        for(int i = n; i <= n * 6; i ++) res.push_back(f[n][i]);

        return res;
    }
 /*   int dfs(int n,int sum){
        if(sum<0){return 0;}
        if(!n){
            return !sum;
        }
        int res=0;
        for(int i=1;i<=6;i++){
            res+=dfs(n-1,sum-i);
        }
        return res;
    }*/
};

  

  

posted @ 2020-10-08 15:10  goldstine  阅读(93)  评论(0)    收藏  举报