最近的几道题

好久没有题解了,原因是:我太菜了!上次国庆放假的时候,也就是10月2号上午,参加leetcode周赛,我只做出来2道easy的,剩下2道medium没有做出来(我记得以前是medium,刚才看了一下,怎么变成hard了?)。那时候我感觉好失落,自己真菜,水平真次,每天还爱装逼,感觉还写什么题解,真是笑掉大牙!刚好前一天的晚上cf也只做出来一道题,我也就2道题的水平,第一道题由于把‘1’写成1,一直没有检查出来!所以,那一刻,心里真不是滋味!刚好前天去面wap,也被刷了,我认为主要原因是英语太差,跟面试官交流非常困难,还有那个树形dp没有搞出来,哎,也就这样吧!

第一题:获取数字,随机输入自然数n,对每个测试实例,要求输出大于n的下一个对称数字。输入451 3840 3363 999,输出454 3883 3443 1001.

分析:要大于n,简单往上加1,然后判断是不是对称的,会过某些用例,但会tle,还有这题没给数据范围,自然数,那就可能非常大,只能通过string来出来,下面找规律。

1. 首先我考虑(都把数字当做字符串来考虑),输入长度,除了全部为9的情况,剩下的输出长度应该跟输入长度一致。为什么,仔细想一想。

2. 下面只考虑奇数长度,暂时不考虑偶数(偶数比奇数长度比较容易处理),这样输入s = s1as2,把输入分解成字符串s1,s2和中间字符a。简单的想法,如果把s1翻转,如果比s2大,显然是满足情况的,而且这也是大于输入的对称的最小的数。

3. 用s1t表示s1的翻转,如果s2大于s1t,那么翻转过去构成的对称的数字就会小于输入的自然后,然后考虑改变,这时候最小的改变就是从a开始,只需要把a加1即可,如果a已经最大,比如9,这时候就要考虑增大s1,只需要简单的把s1增大一点点,然后就可以了,

同时,为了保持最小,有些位置需要设置为0,比如(13941),这里s1=13,s2=41,a=9,s1t = 31,s2 > s1t,需要增大,这时候a无法增大,只能增大s1,s1 = 14,如果a不变,结果就是14941,但是为了最小,14041,也是满足要求的对称自然数。然后就结束了。

下面贴上我的代码,写的有点丑,我就不修改了,反正ac了。我分的情况比较多,其实一些情况可以合并。

  1 /*
  2 ID: y1197771
  3 PROG: test
  4 LANG: C++
  5 */
  6 #include<bits/stdc++.h>
  7 #define pb push_back
  8 #define FOR(i, n) for (int i = 0; i < (int)n; ++i)
  9 #define dbg(x) cout << #x << " at line " << __LINE__ << " is: " << x << endl
 10 typedef long long ll;
 11 using namespace std;
 12 typedef pair<int, int> pii;
 13 const int maxn = 1e3 + 10;
 14 void solve() {
 15     string s;
 16     while(cin >> s) {
 17         int n = s.size();
 18         int cnt = 0;
 19         for (char ch : s) {
 20             cnt += ch == ‘9‘;
 21         }
 22         string res;
 23         if(cnt == n) {
 24             res = "1";
 25             res.append(n - 1, ‘0‘);
 26             res.append(1, ‘1‘);
 27             cout << res << endl;
 28             continue;
 29         }
 30         if(n & 1) {
 31             string s1 = s.substr(0, n / 2);
 32             string s2 = s.substr(n / 2 + 1);
 33             reverse(s1.begin(), s1.end());
 34             if(s2 > s1) {
 35                 if(s[n / 2] == ‘9‘) {
 36                     s[n / 2] = ‘0‘;
 37                     for (int i = 0; i < n / 2; i++) {
 38                        if(s1[i] != ‘9‘) {
 39                             s1[i] = s1[i] + 1;
 40                             break;
 41                         } else s1[i] = ‘0‘;
 42                     }
 43                 } else {
 44                     s[n / 2] = s[n / 2] + 1;
 45                 }
 46                 res = s1;
 47                 res.insert(0, 1, s[n / 2]);
 48                 reverse(s1.begin(), s1.end());
 49                 res = s1 + res;
 50             } else if(s1 == s2) {
 51                 if(s[n / 2] == ‘9‘) {
 52                     s[n / 2] = ‘0‘;
 53                     for (int i = 0; i < n / 2; i++) {
 54                         if(s1[i] != ‘9‘) {
 55                             s1[i] = s1[i] + 1;
 56                             break;
 57                         } else s1[i] = ‘0‘;
 58                     }
 59                 } else {
 60                     s[n / 2] = s[n / 2] + 1;
 61                 }
 62                 res = s1;
 63                 res.insert(0, 1, s[n / 2]);
 64                 reverse(s1.begin(), s1.end());
 65                 res = s1 + res;
 66             } else {
 67                 res = s.substr(0, n / 2 + 1);
 68                 res = res + s1;
 69             }
 70         } else {
 71             string s1 = s.substr(0, n / 2);
 72             string s2 = s.substr(n / 2);
 73             reverse(s1.begin(), s1.end());
 74             if(s2 > s1) {
 75                 for (int i = 0; i < n / 2; i++) {
 76                     if(s1[i] != ‘9‘) {
 77                             s1[i] = s1[i] + 1;
 78                             break;
 79                     } else s1[i] = ‘0‘;
 80                 }
 81                 res = s1;
 82                 reverse(s1.begin(), s1.end());
 83                 res = s1 + res;
 84             } else if(s1 == s2) {
 85                 for (int i = 0; i < n / 2; i++) {
 86                     if(s1[i] != ‘9‘) {
 87                         s1[i] = s1[i] + 1;
 88                         break;
 89                     } else s1[i] = ‘0‘;
 90                 }
 91                 res = s1;
 92                 reverse(s1.begin(), s1.end());
 93                 res = s1 + res;
 94             } else {
 95                 res = s.substr(0, n / 2) + s1;
 96             }
 97         }
 98         cout << res << endl;
 99     }
100 }
101 int main() {
102     //freopen("test.in", "r", stdin);
103     //freopen("test.out", "w", stdout);
104     solve();
105     return 0;
106 }

第二题: 字符串,给定两个均由大写英文字母组成的字符串(A-Z),检查这两个字符串是否包含相同的字母。

水题,直接写。

 1 /*
 2 ID: y1197771
 3 PROG: test
 4 LANG: C++
 5 */
 6 #include<bits/stdc++.h>
 7 #define pb push_back
 8 #define FOR(i, n) for (int i = 0; i < (int)n; ++i)
 9 #define dbg(x) cout << #x << " at line " << __LINE__ << " is: " << x << endl
10 typedef long long ll;
11 using namespace std;
12 typedef pair<int, int> pii;
13 const int maxn = 1e3 + 10;
14 void solve() {
15     string s1, s2;
16     vector<bool> v1(26, 0), v2(26, 0);
17     while(cin >> s1 >> s2) {
18         for (char x : s1) {
19             v1[x - ‘A‘] = 1;
20         }
21         for (char x : s2) {
22             v2[x - ‘A‘] = 1;
23         }
24         bool f = 0;
25         for (int i = 0; i < 26; i++) {
26             if(v1[i] != v2[i]) {
27                 f = 1;
28                 break;
29             }
30         }
31         if(f) cout << "false" << endl;
32         else cout << "true" << endl;
33     }
34 }
35 int main() {
36     //freopen("test.in", "r", stdin);
37     //freopen("data", "w", stdout);
38     solve();
39     return 0;
40 }

第三题:最终收敛值,没有做出来,我用的multiset不断模型,(刚开始用set,才发现有重复元素),这个代码就不贴了,写的太烂。

第四题:

这个题是某某科技现场做的笔试题,不会做!

题意大概是有n个数组,每个数组4个数字,要求每个数字取一个数字,然后加起来,这样的方式一共有4^n种,把这些数字从小到大排序,输出第k大的数字。

函数签名大概是 int findkthnumber(int a[N][4], int n, int k);

没思路,没想法,不会做。如果有想法,求告知!

时间: 2024-08-26 21:55:56

最近的几道题的相关文章

hd1496----&gt;这道题是水水的数论吗?

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1496 题意: Consider equations having the following form: a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 a, b, c, d are integers from the interval [-50,50] and any of them cannot be 0.It is consider a solution a system ( x1,x

6月26号.NET面试题(程序题部分)只要做懂这3道题肯定能脱离菜鸟称号!

说明:1.如果只是想知道正确答案,拷贝代码到vs中运行就行了   2.这3道题我不会做,求指点(只需要告诉我考察的知识点就行了~) 1.下面的代码有什么错误吗,如果有如何改正?(我感觉没错呀~~) public class A { public virtual void F() { Console.WriteLine("A.F"); } } public abstract class B : A { public abstract override void F(); } 2.一道综合

闭包的一道题,不懂闭包的100%答不出来

A.45       B.55      C.90     D.100     E.0 闭包是什么?简单来说,就是存在内存中不会销毁,而这道题就是这样 虽然settimeout设置0ms,但是还是会被放在等待队列,虽然每次循环都执行了,但是只是注册了这个匿名函数,而不会执行函数中的表达式,虽然没有return,这就形成了闭包,把变量i保存起来,已注册的匿名函数就会当时“和自己有联系”的变量i取出来,所以这道题的答案是100 涉及到的知识点:js引擎单线程.闭包.settimeout 说的不是特别

[ACM] SDUT 2886 Weighted Median (省赛最悲剧的一道题)

Weighted Median Time Limit: 2000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 For n elements x1,?x2,?...,?xn with positive integer weights w1,?w2,?...,?wn. The weighted median is the element xk satisfying  and  , S indicates  Can you compute the weighte

每日一道题2014/7/23

10015 - Hankson的趣味题 Time Limit: 1000MSMemory Limit: 65535KB DescriptionHanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫Hankson.现在,刚刚放学回家的Hankson 正在思考一个有趣的问题.今天在课堂上,老师讲解了如何求两个正整数c1 和c2 的最大公约数和最小公倍数.现在Hankson 认为自己已经熟练地掌握了这些知识,他开始思考一个“求公约数”和“求公倍数”之类问题的“逆问题”,这

一道题引发的惨案

昨天在一个cocos2d-x的群里,有群友发了一个问题求答案,当时自已也一下子没想到什么好的写法,这时候有个群友写了一个比较少见的代码方法,当时一看到这代码,我有一种如糊灌顶的感受,因为自已平时基本没用这种写法,今日在别的群,我就发了这道题让大家讨论一下,结果没想到,引发了各种争吵和讨论,有写得不好却自以为是的,有写得好却看不起别人的写法,有写得很好却十分低调的,十分精彩,也算是为群里热闹了一下气氛,QQ群也变成了社会市井的一个浓缩了,呵呵. 以下贴上问题和昨天那位群友写的代码,我觉得精彩的地方

leetCode解题报告5道题(十)

Disk Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2368    Accepted Submission(s): 333 Problem Description 有很多从磁盘读取数据的需求,包括顺序读取.随机读取.为了提高效率,需要人为安排磁盘读取.然而,在现实中,这种做法很复杂.我们考虑一个相对简单的场景.磁

关于 double sort 这道题的思考

声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站,因此,笔者添加此条声明. 郑重声明:这篇记录<关于 double sort 这道题的思考>转载自 http://tiankonguse.com/ 的这条记录:http://tiankonguse.com/record/record.php?id=651 前言 前言的前言 昨天本来写好了这篇记录,

一道题浅析 i++,++i,i+1及(引用)&amp;i的区别

我们可能很清楚i++,++i和i+1级&i的概念,但在实际运用中我们就有可能很容易搞混淆.特别是在递归中区别它们就显得尤为重要了.那首先我们先看一段利用递归逆序字符串的代码,你能回答出这段代码的正确输出吗? #include <iostream> using namespace std; void print(char *s); void print(char *s){ if(*s) { print(++s); cout<<*s<<endl; } } int m

关于图连通性的几道题(水)

POJ 2186 强连通分量缩点 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 6 int en[10010], col[10010], dfn[10010], low[10010], stack[10010], tot[10010], chu[10010]; 7 bool ins[10010]; 8 int n, m, esize, dtime