凡普金科编程题有人做了吗

对于一个非负整数我们称它是美丽的当且仅当它的十进制表示下不包含多个相同的数字。比如1234,7523都是美丽的,但99,121,3043等都不是美丽的。现在给出一个数字n,你需要找到比n大的,最小的美丽的数



某学校近期要组织全校同学出去参加某项活动,由于人数众多,学校决定让同学们自行组队,以小组为单位进行活动。假设学校一共n个同学,每个同学有一个唯一的数字作为标签,标签数字范围1到n。为了统计分组情况,学校要求有分组意愿的同学提交一个数字,表示其会和以该数字为标签的同学分到一组。

现在告诉你每位同学的选择,你能统计出一共有多少个小组么?

注意如果1和2一组,2和3一组,那么1,2,3属于一组。默认自己一定和自己在一组。


全部评论
两道ac
点赞 回复 分享
发布于 2017-09-18 16:55
第一题暴力遍历就行,范围那么小,肯定不会超时的,第二题并查集模板,路径压缩之后统计一下根节点有多少个就行
点赞 回复 分享
发布于 2017-09-22 15:56
第二题,通过数组下标与其相应的值的关系来匹配就行了,只需遍历数组一遍。比如那个例子啊,1 3 4 2 1 为了方便,添加一个零,输入变为a[] = {0, 1,3,4,2,1}, 从1开始遍历,a[1]=1,则根据下标找a[1]同时将a[1]赋值为-1,此时a[1]=-1,跳出继续遍历,a[2]等于3,则根据下标找a[3]同时将a[2]赋值为-1,a[3]等于4,则根据下标找a[4]同时将a[3]赋值为-1,a[4]等于2,则根据下标找a[2]同时将a[4]赋值为-1,此时a[2]=-1, 跳出,继续遍历,这样一次往下就行了,, public static void main(String[] args){         Scanner scan = new Scanner(System.in);         int num = scan.nextInt();         int[] arr = new int[num+1];         for(int i=1;i<=num;i++){             arr[i] = scan.nextInt();         }         scan.close();         int count = 0;                  for(int i=1; i<=num; i++) {             if(i == arr[i]) {                 ++count;                 arr[i] = -1;                 continue;             }             int b = arr[i] + 1 + (arr[i] = -1);                 if((b == -1) || (arr[b]==-1))                 continue;             else                 ++count;                                 while(b != -1) {                 b = arr[b] + 1 + (arr[b] = -1);             }         }         System.out.println(count);     } 考试时,没想到这个方法,暴力求解的,超时了,这是现在写的,测试的例子过了,至于对大数据的例子会不会出错也不知道,没测试过大量数据。如果有错,望大神指出!小弟不胜感激!
点赞 回复 分享
发布于 2017-09-18 19:48
import java.util.HashSet; import java.util.Scanner; import java.util.Set; public class FanpujinkeTest01 {     public static void main(String[] args) {         Scanner in = new Scanner(System.in);         int len = in.nextInt();         int[] tag = new int[len];         for(int i =0 ;i<len;i++){             tag[i]= in.nextInt();         }         int count = 0;         Set<Integer> set = new HashSet<>();         for(int i =0;i<len;i++){             if(set.contains(i+1) || set.contains(tag[i])){                 set.add(i+1);                 set.add(tag[i]);                 continue;             }else{                 set.add(i+1);                 set.add(tag[i]);                 count++;             }         }         System.out.println(count);         in.close();     } } 后来想的一个方法,没试过。。如果还不过的话,想了一下,还可以弄一个boolean[int],开始全为false,判断条件换为if(!boolean[i]和!boolean[tag[i]-1]),出现的都boolean[i]和boolean[tag[i]-1]都设为true,都没就count++。
点赞 回复 分享
发布于 2017-09-18 17:29
小组是并查集,美丽的书遍历一下
点赞 回复 分享
发布于 2017-09-18 17:27
分组那个建立了一个辅助集合,应该超内存了,试了好多特殊样例都通过,但是编译器只能AC百分之10
点赞 回复 分享
发布于 2017-09-18 17:09
等待大佬们的答案,渣渣表示两道才0.1,人生绝望
点赞 回复 分享
发布于 2017-09-18 17:08
考完试了  ,大神可以贴代码了
点赞 回复 分享
发布于 2017-09-18 17:08
求大神思路
点赞 回复 分享
发布于 2017-09-18 17:08
花了一个多小时还是10%,应该是内存超了,我建立二个辅助数组。
点赞 回复 分享
发布于 2017-09-18 17:03
40%正确率,实在想不出来还有哪种情况遗漏了
点赞 回复 分享
发布于 2017-09-18 17:00
能给个思路不
点赞 回复 分享
发布于 2017-09-18 16:58
还没做,是那个测评吗?
点赞 回复 分享
发布于 2017-09-18 16:54

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务