拼多多数据平台开发工程师在线笔试编程题

一共四道,呜呜呜......特此记录一下

  1. 1旋转的字符串

控制台输入4k个字符串,输出k+1行,构成一个成一个正方形

列:输入abcdefghighlmo
控制台输出
abcd
o  e
m  f
gihg
import java.util.Scanner;
public class T {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while(scanner.hasNext()){
            String str = scanner.next();
            int k=str.length()/4;
            String format="%s%"+(k)+"s";
            System.out.println(str.substring(0,k+1));
            for(int i=1;i<=k-1;i++){
                System.out.format(format,str.charAt(str.length()-i),str.charAt(k+i));
                System.out.println();
            }
            System.out.println(new StringBuilder(str.substring(2*k,3*k+1)).reverse().toString());
        }
    }
}
  1. 2有趣的变换

输入字符串,拆分和加小数点,拆分是一定要做的,加小数点可加可不加,求这样拆分、加小数点后的组合数
说明:001 || .1 || 1.0 || 1.10 || 00.1 这样无效的前缀后缀不算有效组合,不列入组合之内

例:123
输出:4
说明:可以拆分为[{1,23},{12,3},{1.2,3},{1,2.3}]
例:00011
输出2
说明:可以拆分为[{0,0.011}, {0.001,1}]
常规思路,拆分了再加小数点,一下代码未经笔试测试,属于后期加工,忘谅
import java.util.HashSet;
import java.util.Random;
import java.util.Scanner;

public class E2 {
    public static void main(String[] args) {
//        Random random = new Random();
        HashSet set = new HashSet();
//        int r1 = random.nextInt(11);
        String str = "";

//        for (int i = 0; i < r1; i++) {
//            str += random.nextInt(10);
//        }
//        System.out.println("raw:"+str);
        Scanner scanner = new Scanner(System.in);
        str = scanner.next();
        for (int i = 1; i < str.length(); i++) {
            String s1 = str.substring(0, i);
            String s2 = str.substring(i);
            if (check(s1) && check(s2)) {
                set.add(s1 + ":" + s2);
            }
            addNode(set, s1, s2);
        }
        System.out.println(set.size() + ":" + set);
    }

    private static void addNode(HashSet set, String s1, String s2) {
        if (s1.length() == 1) {
            if (s2.length() == 1) {
                return;
            } else {
                for (int i = 1; i < s2.length(); i++) {
                    String s2pre = s2.substring(0, i);
                    String s2suf = s2.substring(i);
                    if (checkPointPre(s2pre) && checkPointSuf(s2suf)) {
                        set.add(s1 + ":" + s2pre + "." + s2suf);
                    }
                }
            }
        } else {
            if (s2.length() == 1) {
                for (int i = 1; i < s1.length(); i++) {
                    String s1pre = s1.substring(0, i);
                    String s1suf = s1.substring(i);
                    if (checkPointPre(s1pre) && checkPointSuf(s1suf)) {
                        set.add(s1pre + "." + s1suf + ":" + s2);
                    }
                }
            } else {
                for (int i = 1; i < s1.length(); i++) {
                    String s1pre = s1.substring(0, i);
                    String s1suf = s1.substring(i);
                    if (checkPointPre(s1pre) && checkPointSuf(s1suf)) {
                        for (int j = 1; j < s2.length(); j++) {
                            String s2pre = s2.substring(0, j);
                            String s2suf = s2.substring(j);
                            if (checkPointPre(s2pre) && checkPointSuf(s2suf)) {
                                set.add(s1pre + "." + s1suf + ":" + s2pre + "." + s2suf);
                            }
                        }
                    }
                }
            }
        }
    }

    private static boolean checkPointPre(String s2pre) {
        if (s2pre.length() == 1) {
            return true;
        }
        return !s2pre.substring(0, 1).equals("0");

    }

    private static boolean checkPointSuf(String s2suf) {
        return !s2suf.substring(s2suf.length() - 1).equals("0");

    }

    private static boolean check(String s1) {
        if (s1.length() == 1) {
            return true;
        }
        return !(s1.substring(0, 1).equals("0"));
    }
}

 

  1. 多多社交推荐

  2. 给定一个含有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都相互认识
    
    解题思路
    一开始,乍一看,还以为是要用图的遍历什么,来关联这些个人的朋友,太复杂了!
    转头想了想还是不可能实现,而且用图去考虑思索,实在是不知道要怎么去判定了相同朋友多的才是可能的朋友。
    放弃了图的想法。
    最后,认真关注到了说明解释。
    发现,其实说明已经是在暗示我们应该处理方法,一开始,我陷入到了1->0 4 , 2 ->0 4 , 3-> 0 4 ,还想着把这三个也处理下,但是说明只是给了我们0 和 4 ,没有太多的必要去考虑1 2 3 用户干嘛,发现只要用hashmap。
     
     
    第一步,设置一个hashmap用于存储 用户 和 他对应的朋友列表!
         也即是hashMap<integer, ArrayList<integer>>> 
    第二步,在处理输入的同时,做一个判断,不在目标用户的朋友列表中的用户,该用户的朋友才能进入设置的 hashmap中,因为只要是在目标用户的朋友圈中,那都已经是朋友了,题意也说明了这一点,提前处理好hashmap,接下来的工作就好做了。
     
    第三步,已经是知道了目标用户的朋友圈,拿出来。
           做一个迭代器,或者是使用Map.Entry<?,?> 去设置遍历条件,来遍历hashmap.
        第三.一步,不比对是自己的朋友圈,(自己在输入的时候,为了判断方便,将自己朋友圈也放在了map中),只比对不是自己的朋友圈,有相同的朋友,设置一个count变量去标记,在循环外设置标记最大相同的朋友数。
        第三.二步,实时更新最大朋友圈数,更新最可能是朋友的键值索引index.
        第三.三步,一定一定注意,如果有多个朋友圈数一样,这种情况也要考虑在内,选择最早的朋友圈一样的用户索引即可。后续如果题目变更或者是其他类似的,也可以进行相应的变化。
    代码&注释
    package com.Mukvin.PingDuoDuo;
     
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Scanner;
     
    public class ComunicationRecomendation {
     
    	public static void main(String[] args) {
    		
    		Scanner scanner = new Scanner(System.in);
    		int N = scanner.nextInt();//N个用户
    		int target = scanner.nextInt();//目标用户(要找朋友的人)
    		
    		//设置存储用户和对应的朋友列表的map
    		HashMap<Integer, ArrayList<Integer>> totalMap = new HashMap<>();
    		
    		scanner.nextLine();//处理换行进入循环输入,如果不添加,会提示报错 :java.lang.NumberFormatException: For input string: ""
    		for(int i = 0;i < N;i++ ) {
    			String tempNumStr = scanner.nextLine();
    			ArrayList<Integer> tempNumList = new ArrayList<>();//存储各个用户对应的朋友列表
    			for(String str : tempNumStr.split(" ")) {
    				//将得到的"1 2 3"切割,做成一个字符串数组
    				tempNumList.add(Integer.parseInt(str));
    			}
    			//升级下map:升级规则如下
    			//如果当前输入,就是用户自己,那么将他的所有朋友放进map中
    			//如果当前的输入的不是用户自己,而是别的用户,但是他们的朋友列表如果包含了目标用户,则不放tempList
    			
    			//也即,只要不包含了目标用户的,输入用户他的朋友列表都放进来,那些才是目标用户有可能潜在的朋友
    			if (target == i || !tempNumList.contains(target)) {
    				totalMap.put(i, tempNumList);
    			}
    		}
    		//获得目标用户的他原先的朋友列表,以便能在后面的比对,别人的不包含目标用户的朋友列表
    		ArrayList<Integer> targetFriends = totalMap.get(target);
    		System.out.println(findPossibleFriend(target,totalMap,targetFriends));
    		scanner.close();
    	}
     
    	private static int findPossibleFriend(int target, HashMap<Integer, ArrayList<Integer>> totalMap,
    			ArrayList<Integer> targetFriends) {
    		//判断用户的可能朋友,要找类似朋友最多的那个,设定三个指标。
    		int maxSameFriends = 0; //表示最多共同朋友数
    		
    		int index = 0; //确定目标用户可能朋友的索引
    		
    		//遍历map有三种方法(使用keySet,使用entrySet,使用迭代器),这里使用entrySet
    		for(Map.Entry<Integer,ArrayList<Integer>> entry : totalMap.entrySet()) {
    			ArrayList<Integer> tempFriends = entry.getValue();
    			int tempCount = 0;//临时变量,表示每个用户与目标用户的相同朋友个数
    			
    			//如果entry的一个用户不是target,则进行比对
    			if (entry.getKey() != target) {
    				for(int i = 0 ;i < tempFriends.size();i++) {
    					//比对相似用户,如果有一个一致则maxSameFriends++
    					if (targetFriends.contains(tempFriends.get(i))) {
    						tempCount++;
    					}
    				}
    			}
    			
    			//更新maxSameFriends与index
    			if(tempCount > maxSameFriends ) {
    				maxSameFriends =tempCount;
    				index = entry.getKey();
    			}
    			
    			//假设这个时候有多个人的共同朋友数是一样的,则只取前面最开始朋友数相同,但是索引下标最小的那个人
    			if (maxSameFriends == tempCount && entry.getKey() < index) {
    				index = entry.getKey();
    			}
    		}
    		return index;
    	}
    }
    第三题转载:博文原地址:https://blog.csdn.net/mukvintt/article/details/81451204

     

  3. 升序降序取数游戏

题目描述
多多鸡正在玩一个取卡片的游戏,有n个标有正整数的卡片,从左到右依次排列,每轮取卡哆哆鸡必须满足升序规则和降序规则中的一种:
升序规则:取出的右边卡片数值大于左边卡片数值;
降序规则:取出的右边卡片数值小于左边卡片数值;
帮多多鸡算算最少需要多少轮游戏可以取完所有的卡片。

输入描述
输入为两行,第一行为卡片个数n(1<=n<=50),第二行为长度为n的正整数序列。
输出描述
一个整数,代表最少的轮次。
例
输入:
5
3 5 2 4 1
 
输出:
2
 
说明:
第一轮321,第二轮54。
----------------------------------------------------------------------
输入:
6
1 2 4 3 3 3
 
输出:
3
 
说明:
第一轮13,第二轮23,第三轮43。

思路:1.深度遍历

2.不断的求 最长递增子序列https://mp.weixin.qq.com/s?__biz=MzAxODQxMDM0Mw==&mid=2247485269&idx=1&sn=571a6366b0b592f103971ae3e119998b&chksm=9bd7f95daca0704be3c5c839cd96ab1a94efaefb48fa3101522a02fa19af9ef48170e03cd817&mpshare=1&scene=1&srcid=0715jF0vZKOmrINg38ntX5ku&sharer_sharetime=1594746498770&sharer_shareid=81a5d955528ee0b52ce5d5145e74a620&key=a2622e402501f8cb7a8cbaa2aa4e9e99301e8817251a41cf98c65236622d80942d6a9310a21f1b28ecc18fb469ae020b57a4ecfe4058122b6d7b975ac29c3e8d02d3c89c2a3e8b84d83f5616a31d6d3e&ascene=1&uin=MTgyNzg0NDEyNQ%3D%3D&devicetype=Windows+10+x64&version=62090529&lang=zh_CN&exportkey=AZDfO5qStw8EQpJlmwWKOgs%3D&pass_ticket=msZkjBl7ngN3MITm0gO%2Fz3BifUyXEZPPiysSRWuiY%2BUt6LRG%2FwJGG%2F74TsglkpRd

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

i am cscs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值