一共四道,呜呜呜......特此记录一下
-
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());
}
}
}
-
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"));
}
}
-
多多社交推荐
-
给定一个含有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
-
升序降序取数游戏
题目描述
多多鸡正在玩一个取卡片的游戏,有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.深度遍历