zoukankan      html  css  js  c++  java
  • Leetcode Weekly Contest 86

    Weekly Contest 86

    A:840. 矩阵中的幻方

    3 x 3 的幻方是一个填充有从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。

    给定一个由整数组成的 N × N 矩阵,其中有多少个 3 × 3 的 “幻方” 子矩阵?(每个子矩阵都是连续的)。

    直接模拟即可,本来是签到题,由于粗心,浪费了时间。

     1 class Solution {
     2 public:
     3     int numMagicSquaresInside(vector<vector<int>>& grid) {
     4         vector<vector<int> >a = grid;
     5         int ans = 0;
     6         for(int i = 0; i + 2 < a.size(); i++)
     7         {
     8             for(int j = 0; j + 2 < a[0].size(); j++)
     9             {
    10                 set<int>s;
    11                 bool flag = 1;
    12                 for(int ii = i; ii <= i + 2; ii++)
    13                 {
    14                     for(int jj = j; jj <= j + 2; jj++)
    15                     {
    16                         if(a[ii][jj] >= 10 || a[ii][jj] <= 0)
    17                         {
    18                             flag = 0;
    19                         }
    20                         s.insert(a[ii][jj]);
    21                     }
    22                 }
    23                 if(flag && s.size() == 9)
    24                 {
    25                     int a1 = a[i][j] + a[i + 1][j + 1] + a[i + 2][j + 2];
    26                     int a2 = a[i][j + 2] + a[i + 1][j + 1] + a[i + 2][j];
    27                     //cout<<a1<<" "<<a2<<endl;
    28                     if(a1 == a2 && a1 == 15)
    29                     {
    30                         for(int ii = i; ii <= i + 2; ii++)
    31                         {
    32                             int a3 = a[ii][j] + a[ii][j + 1] + a[ii][j + 2];
    33                             if(a3 != 15)flag = 0;
    34                         }
    35                         for(int ii = j; ii <= j + 2; ii++)
    36                         {
    37                             int a3 = a[i][ii] + a[i + 1][ii] + a[i + 2][ii];
    38                             if(a3 != 15)flag = 0;
    39                         }
    40                         if(flag)ans++;
    41                     }
    42                 }
    43             }
    44         }
    45         return ans;
    46     }
    47 };

    B:841. 钥匙和房间

    有 N 个房间,开始时你位于 0 号房间。每个房间有不同的号码:0,1,2,...,N-1,并且房间里可能有一些钥匙能使你进入下一个房间。

    在形式上,对于每个房间 i 都有一个钥匙列表 rooms[i],每个钥匙 rooms[i][j] 由 [0,1,...,N-1] 中的一个整数表示,其中 N = rooms.length。 钥匙 rooms[i][j] = v 可以打开编号为 v 的房间。

    最初,除 0 号房间外的其余所有房间都被锁住。

    你可以自由地在房间之间来回走动。

    如果能进入每个房间返回 true,否则返回 false

    直接用BFS即可,到达每一点,比赛的时候用并查集也过了,但是后来想这是有向边,并查集合并的是无向边,应该是数据水的原因

     1 class Solution {
     2 public:
     3     bool canVisitAllRooms(vector<vector<int> >& rooms) {
     4         queue<int>q;
     5         q.push(0);
     6         int vis[1005] = {0};
     7         while(!q.empty())
     8         {
     9             int now = q.front();
    10             q.pop();
    11             for(int i = 0; i < rooms[now].size(); i++)
    12             {
    13                 int next = rooms[now][i];
    14                 if(!vis[next])
    15                 {
    16                     vis[next] = 1;
    17                     q.push(next);
    18                 }
    19             }
    20         }
    21         for(int i = 1; i < rooms.size(); i++)
    22         {
    23             if(vis[i] == 0)return false;
    24         }
    25         return true;
    26     }
    27 };

    C:842. 将数组拆分成斐波那契序列

    给定一个数字字符串 S,比如 S = "123456579",我们可以将它分成斐波那契式的序列 [123, 456, 579]

    形式上,斐波那契式序列是一个非负整数列表 F,且满足:

    • 0 <= F[i] <= 2^31 - 1,(也就是说,每个整数都符合 32 位有符号整数类型);
    • F.length >= 3
    • 对于所有的0 <= i < F.length - 2,都有 F[i] + F[i+1] = F[i+2] 成立。

    另外,请注意,将字符串拆分成小块时,每个块的数字一定不要以零开头,除非这个块是数字 0 本身。

    返回从 S 拆分出来的所有斐波那契式的序列块,如果不能拆分则返回 []

    枚举第一项和第二项的位数即可,保证没有前导0,还需要保证以后的每一项在2的31次方以内

     1 class Solution {
     2 public:
     3     vector<int> splitIntoFibonacci(string S) {
     4         for(int i = 1; i <= min(10, (int)S.size()); i++)
     5         {
     6             for(int j = 1; j <= min(10, (int)S.size()); j++)
     7             {
     8                 if(i + j - 1 >= S.size())break;
     9                 string s1, s2;
    10                 for(int k = 0; k < i; k++)s1 += S[k];
    11                 for(int k = i; k < i + j; k++)s2 += S[k];
    12                 if(s1[0] == '0' && i != 1 || s2[0] == '0' && j != 1)continue;
    13                 vector<int>ans;
    14                 string tmp = s1 + s2;
    15                 stringstream ss(s1), ss1(s2);
    16                 long long a, b, c;
    17                 ss >> a;ss1 >> b;
    18                 ans.push_back(a);
    19                 ans.push_back(b);
    20                 while(1)
    21                 {
    22                     c = a + b;
    23                     if(c >= (1LL<<31))
    24                     {
    25                         break;
    26                     }
    27                     ans.push_back(c);
    28                     stringstream ss;
    29                     ss << c;
    30                     string s3;
    31                     ss >> s3;
    32                     tmp += s3;
    33                     if(tmp.size() > S.size())break;
    34                     if(tmp == S)return ans;
    35                     a = b;
    36                     b = c;
    37                 }
    38             }
    39         }
    40         vector<int>ans;
    41         return ans;
    42     }
    43 };

    D:843. 猜猜这个单词

    这个问题是 LeetCode 平台新增的交互式问题 

    我们给出了一个由一些独特的单词组成的单词列表,每个单词都是 6 个字母长,并且这个列表中的一个单词将被选作秘密。

    你可以调用 master.guess(word) 来猜单词。你所猜的单词应当是存在于原列表并且由 6 个小写字母组成的类型字符串

    此函数将会返回一个整型数字,表示你的猜测与秘密单词的准确匹配(值和位置同时匹配)的数目。此外,如果你的猜测不在给定的单词列表中,它将返回 -1

    对于每个测试用例,你有 10 次机会来猜出这个单词。当所有调用都结束时,如果您对 master.guess 的调用不超过 10 次,并且至少有一次猜到秘密,那么您将通过该测试用例。

    除了下面示例给出的测试用例外,还会有 5 个额外的测试用例,每个单词列表中将会有 100 个单词。这些测试用例中的每个单词的字母都是从 'a' 到 'z' 中随机选取的,并且保证给定单词列表中的每个单词都是唯一的。

    一开始以为是难题,后来发现就是水题一个,直接模拟即可,每次随机询问一个位置即可,得到答案为t,把字符串数组中与该位置有t个相同的字符串作为下一组字符串数组继续查询。

     1 /**
     2  * // This is the Master's API interface.
     3  * // You should not implement it, or speculate about its implementation
     4  * class Master {
     5  *   public:
     6  *     int guess(string word);
     7  * };
     8  */
     9 class Solution {
    10 public:
    11     int judge(string a, string b)
    12     {
    13         int tot = 0;
    14         for(int i = 0; i < a.size(); i++)
    15         {
    16             if(a[i] == b[i])tot++;
    17         }
    18         return tot;
    19     }
    20     void findSecretWord(vector<string>& wordlist, Master& master) {
    21         vector<string>now = wordlist, next;
    22         while(1)
    23         {
    24             next.clear();
    25             int s = rand()%now.size();
    26             int t = master.guess(now[s]);
    27             if(t == 6)break;
    28             for(int i = 0; i < now.size(); i++)
    29             {
    30                 if(judge(now[i], now[s]) == t)
    31                     next.push_back(now[i]);
    32             }
    33             now = next;
    34         }
    35     }
    36 };

     

  • 相关阅读:
    JavaScript-年月日转换12小时制
    Javascript-双色球
    Javascript-for循环案例-打印1-100之间所有的数字
    HDU4240_Route Redundancy
    HDU2883_kebab
    POJ3041_Asteroids
    HDU3829_Cat VS Dog
    BZOJ2806_Cheat
    HDU4641_K-string
    CF271D_Good Substrings
  • 原文地址:https://www.cnblogs.com/fzl194/p/9097783.html
Copyright © 2011-2022 走看看