BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #59823同步于 2018/8/6
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

2018年8月5日晚 【拼多多】算法题目第3、4题求助

zhaoxiyuan
2018/8/6镜像同步7 回复
第1题:旋转字符串 2018年8月5日 拼多多笔试算法第1道 时间限制:C/C++ 1秒,其他语言2秒; 空间限制:C/C++ 32768K,其他语言65536K; 64bit IO Format:%IId 题目描述: 给定一个字符串,按顺时针顺序输出一个正方形,具体规则如下: (1) 从上边开始,上边从左到右; (2) 然后到右边,右边从上到下; (3) 然后是下边,下边从右到左; (4) 最后是左边,左边从下到上。 输入描述: 输入一行,包含4K(K为整数,1<=K<=10)个小写字母。 输出描述: 输出K+1行,按上面的规则输出正方形,正方形内部用空格填充。 示例: 输入: abcdefghijklmnop 输出: abcde p f o g n h mlkj i Java代码: /** * the first problem * 旋转的字符串 */ public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String str = scanner.nextLine(); char[] chars = str.toCharArray(); int K = chars.length/4; char[] spaces = new char[K-1]; for(int i = 0;i<K-1;i++){ spaces[i] = ' '; } String spaceStr = new String(spaces); for(int i = 0;i < K+1;i++){//控制行数:分成三种情况 if(i == 0){ System.out.println(str.substring(0,K+1)); }else if(i >0 && i < K){ System.out.println(chars[4*K-i]+spaceStr+chars[K+i]); }else{ System.out.println(new StringBuilder(str.substring(2*K,3*K+1)).reverse().toString()); } } } 第2题:有趣的变换 2018年8月5日 拼多多笔试算法第2道 时间限制:C/C++ 1秒,其他语言2秒; 空间限制:C/C++ 32768K,其他语言65536K; 64bit IO Format:%IId 题目描述: 字符串形式的正整数(可能包含前缀0,1<=length<=10),先将这个字符串拆分成两部分,接着可以在这两部分中分别加入一个小数点也可以不加入,分别形成一个整数或小数。找出所有经“拆分”和“变化”两次操作后所有可能组合的数目。 要求: 1). 对于新形成的整数和小数,不可包含多余的前缀0,比如010和010.1不合法; 2). 对于小数,不可包含多余的后缀0,比如0.10不合法; 3). .1和1.这样的小数不合法。 输入描述: 输入为一行,包含一个字符串形式的正整数。 输出描述: 输出为一行,找出经过“拆分”和“变化”后的所有组合的数目。 示例1: 输入: 123 输出: 4 说明:[[1,23],[12,3],[1.2,3],[1,2.3]] 示例2: 输入: 00011 输出: 2 可能的组合如下: [[0.001,1],[0,0.011]] Java代码 public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String numStr = scanner.nextLine(); char[] nums = numStr.toCharArray(); int count = 0; for(int i = 0;i < nums.length-1;i++){ int leftCount = halfCount(nums,0,i); if(leftCount == 0) continue;//提高效率;左段不存在;右段就不用统计了 int rightCount = halfCount(nums,i + 1,nums.length-1); count += leftCount*rightCount; } System.out.println(count); } public static int halfCount(char[] nums,int from ,int end){ if(from == end) return 1;//一位数肯定就一种 if(nums[from] == '0'&& nums[end] == '0') return 0;//前后都有0,肯定不合法 if(nums[from] == '0'|| nums[end] == '0') return 1;//以0开头只能为0.xxx;以0结尾只能为整数 return end-from+1;//如345,:345,3.45,34.5 } 第3题:多多社交推荐 2018年8月5日 拼多多笔试算法第3道 时间限制:C/C++ 1秒,其他语言2秒; 空间限制:C/C++ 32768K,其他语言65536K; 64bit IO Format:%IId 题目描述: 给定一个含有N个用户的朋友列表,对于一个指定用户,找出这个用户最可能认识的人。最可能认识的人的定义为这个人和当前用户不是朋友关系,但有最多的共同朋友。 朋友关系是相互的(如果A列出B为朋友,B也会列出A为朋友),如果两个用户都有同样多的共同朋友,返回用户序号(从0开始)小的用户。如果用户和所有人都没有共同朋友,返回-1。 输入描述: 第一行两个数,第一个数表示用户数目N(N小于等于100),第二个数为需要判断的用户序号。第2至N+1行表示序号为0到序号为N-1的每个用户的朋友序号列表,每个列表的长度小于100。 输出描述: 给定用户最可能认识的人的用户序号。 示例: 输入: 5 0 1 2 3 0 4 0 4 0 4 1 2 3 输出: 4 说明:用户0与用户1、2、3都相互认识,用户4与用户1、2、3都相互认识。 Java代码 待续...... 第4题:升序降序取数游戏 2018年8月5日 拼多多笔试算法第4道 时间限制:C/C++ 1秒,其他语言2秒; 空间限制:C/C++ 32768K,其他语言65536K; 64bit IO Format:%IId 题目描述: 多多鸡正在玩一个取卡片的游戏,有n个标有正整数的卡片,从左到右一次排列,每轮取卡多多鸡必须满足升序规则和降序规则中的一种: 升序规则:取出的右边卡片数值大于左边卡片数值; 降序规则:取出的右边卡片数值小于左边卡片数值; 帮多多鸡算算最少需要多少轮游戏可以取完所有的卡片。 输入描述: 输入为两行,第一行为卡片个数n(1<= n<=50),第二行为长度为n的正整数序列。 输出描述: 一个整数,代表最少的轮次。 示例1: 输入: 5 3 5 2 4 1 输出: 2 说明: 第一轮321,第二轮54 示例2: 输入: 6 1 2 4 3 3 3 输出: 3 说明: 第一轮13,第二轮23,第三轮43 Java代码 待续......
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
a2013211232机器人#1 · 2018/8/6
第三题感觉可以直接暴力啊,N不超过100,并且每个人的朋友数也不超过100,建立一个res = [0]*N存储共同朋友数,拿测试样例来说,遍历0认识的所有人(1,2,3)`因为朋友数不超过100,所以循环次数不超过100`,遍历到1时,就把所有认识1的人res+1`这里也不超过100,所以总共不会超过10000`,最后排个序,然后排除自己本身,排除已经认识的人,取剩下最高的数的下标就Ok了吧(sort是稳定排序,所以此时最高就是下标最小)
a2013211232机器人#2 · 2018/8/6
第四题感觉又可以用暴力啊,我的第一反应是进行若干次最长上升(下降)子序列的判断。。。毕竟数据长度不超过50,但感觉有点蠢
cc19931002机器人#3 · 2018/8/6
暴力之前能不能先给我讲一讲第四题什么意思? 【 在 a2013211232 的大作中提到: 】 : 第四题感觉又可以用暴力啊,我的第一反应是进行若干次最长上升(下降)子序列的判断。。。毕竟数据长度不超过50,但感觉有点蠢
dxy1机器人#4 · 2018/8/6
【 在 zhaoxiyuan 的大作中提到: 】 : 第1题:旋转字符串 : 2018年8月5日 拼多多笔试算法第1道 : 时间限制:C/C++ 1秒,其他语言2秒; : ................... 第三题每个人建立一个朋友表hash,然后查询用户q和每个不是他朋友的共同好友的最大个数,直接暴力就好了; 第四题正序和逆序搜最长递增子序列,要注意的一点是相邻且相等值优先
Wizmann机器人#5 · 2018/8/6
但是代码是真恶心。 因为要找到具体的LIS,所以只能用O(n^2) DP。然后还要回头找LIS。然后再做好多轮。。=。= 【 在 a2013211232 的大作中提到: 】 : 第四题感觉又可以用暴力啊,我的第一反应是进行若干次最长上升(下降)子序列的判断。。。毕竟数据长度不超过50,但感觉有点蠢
caesar11机器人#6 · 2018/8/6
多个LIS方案时咋办,如何保证正确性呢? 【 在 Wizmann 的大作中提到: 】 : 但是代码是真恶心。 : 因为要找到具体的LIS,所以只能用O(n^2) DP。然后还要回头找LIS。然后再做好多轮。。=。= :
Wizmann机器人#7 · 2018/8/6
每次贪心的拿最多的数字走,总不会让剩下的情况变的更差。 【 在 caesar11 的大作中提到: 】 : 多个LIS方案时咋办,如何保证正确性呢?