2016网易实习生编程题:n个骰子的和等于m
题目
骰子的点数是1 到 6,当有n个骰子的时候,其点数和等于m的数量
如当n = 4 m = 23时候 有下面四种:
5666
6566
6656
6665
解题
深度优先,开始第一感觉很复杂,然后就没有写,后来在最后几分钟写了出来,但是提交发现以为有相同的情况,用TreeSet存放符合条件的种类,发现还是不对,刚在本地测试发现下面的问题
当求 2 个数的和是 6的时候,输出结果是 15 、24、33、42、51、6,当两个数的和是5的时候输出:14、41、23、32、5 ,是这种情况我误以为是由于出现重复数据,最后时间不对,也没有再改
但是对于自己能做到这里还是比较满意的。
对于出现长度不到n,和等于m的情况,只有利用其长度了。应该有其他的好方法
import java.util.Iterator;
import java.util.TreeSet;
import java.util.Scanner;
public class Main{
static int count;
static TreeSet<String> set;
public static void main(String[] args){
Scanner in = new Scanner(System.in);
while(in.hasNext()){
count = 0;
set = new TreeSet<String>();
int n = in.nextInt();
int m = in.nextInt();
String s = "";
dfs(n,n,m,s);
System.out.println(count+"\t"+set.size());
Iterator it = set.iterator();
while(it.hasNext()){
String tmp = (String)it.next();
System.out.print(tmp+"\t");
}
}
in.close();
}
public static void dfs(int N,int n,int m,String s){
if(n<0)
return;
if(n==0 && m==0 && s.length() == N){
//System.out.println(s);
set.add(s);
count++;
return;
}
while((n--)>0){
for(int i =1;i<=6;i++){
s+=i+"";
dfs( N,n,m-i,s);
s = s.substring(0,s.length()-1);
}
}
}
}
那么少的程序,傻子都能写出来了。。。
提交的程序少了一行:
s = s.substring(0,s.length()-1);
这样对个数竟然没有影响(虽然可能输出只有一个数就等于m的情况)
原因是判断少了
s.length() == N
但是为什么不加判断是否等于N时候为什么可以输出一个数的和等于m的情况?可能是while循环中用到了 n--的情况
我的这个方法还是不好,用N判断长度,太冗余,利用TreeSet增加了空间复杂度。
上面可以发现我定义count最后的值和TreeSet的大小是一样的,所有可以不用TreeSet。
更新如下
import java.util.Scanner;
public class Main{
static int count;
public static void main(String[] args){
Scanner in = new Scanner(System.in);
while(in.hasNext()){
count = 0;
int n = in.nextInt();
int m = in.nextInt();
String s = "";
dfs(n,n,m,s);
System.out.println(count);
}
in.close();
}
public static void dfs(int N,int n,int m,String s){
if(n<0)
return;
if(n==0 && m==0&& s.length() == N){
count++;
return;
}
while((n--)>0){
for(int i =1;i<=6;i++){
s+=i+"";
dfs( N,n,m-i,s);
s = s.substring(0,s.length()-1);
}
}
}
}
在第一次写的时候也没有TreeSet 在输入2 6多出一个结果的时候才用TreeSet,结果还是没有找到主要问题,但是网易测试用例要自己输入,一个坑,不知道自己的用例是否太少。
测出结果
1 6
1 1
6
2 6
5 5
15 24 33 42 51
4 23
4 4
5666 6566 6656 6665
5 25
126 126
16666 25666 26566 26656 26665 34666 35566 35656 35665 36466 36556 36565 36646 36655 36664 43666 44566 44656 44665 45466 45556 45565 45646 45655 45664 46366 46456 46465 46546 46555 46564 46636 46645 46654 46663 52666 53566 53656 53665 54466 54556 54565 54646 54655 54664 55366 55456 55465 55546 55555 55564 55636 55645 55654 55663 56266 56356 56365 56446 56455 56464 56536 56545 56554 56563 56626 56635 56644 56653 56662 61666 62566 62656 62665 63466 63556 63565 63646 63655 63664 64366 64456 64465 64546 64555 64564 64636 64645 64654 64663 65266 65356 65365 65446 65455 65464 65536 65545 65554 65563 65626 65635 65644 65653 65662 66166 66256 66265 66346 66355 66364 66436 66445 66454 66463 66526 66535 66544 66553 66562 66616 66625 66634 66643 66652 66661
2016-03-22 22:27:18
上面程序有问题
参加下面
public ArrayList<String> nSumk(int n,int k){
String list = "";
ArrayList<String> result = new ArrayList<String>();
if(n<=0 || k< n || k > n*6 ) // 非法输入
return result;
DFS(n,1,k,result,list);
return result;
}
public void DFS(int n,int start,int k,
ArrayList<String> result,String list){
if(list.length() == n && k==0){
result.add(new String(list));
return;
}
for(int j=1;j<=6;j++){
if(k-j<0)
return;
k -=j;
list += j;
DFS(n,start+1,k,result,list );
k +=j;
list = list.substring(0,list.length() - 1);
// DFS(n,start+1,k-j,result,list + j);
}
}
2016网易实习生编程题:n个骰子的和等于m的更多相关文章
- 2016网易实习生编程题:数组中两个数的和等于sum
题目 找出数组中两个数的和等于sum的这两个数 解题 这个题目做过很多次了,利用HashMap,key为 sum-A[i] value为 i 当 加入HashMap时候A[i] 已经存在map中,ge ...
- 腾讯2017年暑期实习生编程题【算法基础-字符移位】(C++,Python)
算法基础-字符移位 时间限制:1秒 空间限制:32768K 题目: 小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间. 你能帮帮小Q吗? ...
- 网易2016研发project师编程题
http://www.nowcoder.com/test/970447/summary [编程题] 小易的升级之路 小易常常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 a ...
- JavaScript编程题(含腾讯2016校招题)
作者:ManfredHu 链接:http://www.manfredhu.com/2016/04/02/15-veryGoodForUsing/ 声明:版权所有,转载请保留本段信息,否则请不要转载 几 ...
- 腾讯2016校招编程题【PHP实现】
2016腾讯春招的编程题 话不多说,直接上题!!! 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串.如何删除才能使得回文串最长呢?输出需要删除的字符个数 . 这道题是以回文为载体, ...
- 网易2019校招内推编程题-瞌睡-C++实现
[编程题] 瞌睡 时间限制:1秒 空间限制:262144K 小易觉得高数课太无聊了,决定睡觉.不过他对课上的一些内容挺感兴趣,所以希望你在老师讲到有趣的部分的时候叫醒他一下.你知道了小易对一堂课每分钟 ...
- 网易2019校招内推编程题-俄罗斯方块-C++实现
[编程题] 俄罗斯方块 时间限制:1秒 空间限制:262144K 小易有一个古老的游戏机,上面有着经典的游戏俄罗斯方块.因为它比较古老,所以规则和一般的俄罗斯方块不同.荧幕上一共有 n 列,每次都会有 ...
- 网易2018校招内推编程题-堆棋子-C++实现
链接:https://www.nowcoder.com/questionTerminal/27f3672f17f94a289f3de86b69f8a25b来源:牛客网 [编程题]堆棋子 热度指数:14 ...
- 转载:2017百度春季实习生五道编程题[全AC]
装载至:https://blog.csdn.net/zmdsjtu/article/details/70880761 1[编程题]买帽子 时间限制:1秒空间限制:32768K度度熊想去商场买一顶帽子, ...
随机推荐
- iOS开发之Pch预编译文件的创建
在Xcode6之前,创建一个新工程xcode会在Supporting files文件夹下面自动创建一个“工程名-Prefix.pch”文件,也是一个头文件,pch头文件的内容能被项目中的其他所有源文件 ...
- sql优化点整理
此文是我最早开始sql优化至今整理的小知识点和经常遇到的问题,弄懂这些对优化大型的sql会有不少帮助 ---------------------------------使用了多余的外连接------- ...
- 浅谈ERP系统实施后如何完善企业内部控制制度建设
ERP与企业内部控制制度,前者提升企业的管理水平,后者为企业发展保驾护航,两项工作都是企业各项工作的重中之重. ERP是企业资源规划Enterprise Resource Planning的缩写.企业 ...
- 四则运算出题器(c++)
一.设计思路 这次版本加入了一下功能: 可定制题目的数量:修改循环次数: 可以定制每行打印的题目数和行间距的大小(当前题目序号可以整除定制数时输出输入的行间距个换行符): 可以定制算式的范围(修改随机 ...
- HashCode作用
作用: 1.HashCode的存在主要是为了查找的快捷性,HashCode是用来在散列存储结构中确定镀锡的存储地址的 2.如果两个对象的equals相等,那么HashCode一定相等,反之不行 3.如 ...
- jQuery实现模拟滚动条效果;
滚动条在web开发中,很常见,原生的HTML滚动条很难看,因此很多网站借助JS来模拟实现滚动条效果: 滚动条的实现原理其实比较简单,拿垂直滚动条来说: 1),最外层容器需要设置overflow:hid ...
- C#外挂QQ找茬辅助源码,早期开发
这是一款几年前开发的工具,当年作为一民IT纯屌,为了当年自己心目中的一位女神熬夜开发完成.女神使用后找茬等级瞬间从眼明手快升级为三只眼...每次看到这个就会想起那段屌丝与女神的回忆.今天特地把代码更新 ...
- openstack与VMware workStation的区别
免责声明: 本文中使用的部分图片来自于网络,如有侵权,请联系博主进行删除 最近一直在研究云计算,恰好有个同事问了我一个问题:你们研究的openstack到底是什么东西?跟VMware Work ...
- 【IDA*】codevs 2495:水叮当的舞步
2495 水叮当的舞步 题目描述 Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变. 为了讨好她的偶像虹猫,水叮当决定在地毯上 ...
- 玩具装箱 bzoj1010 斜率优化
斜率优化的题好像都是这样的方程:左边关于j,k的一个(...)/(...)的式子,右边是个只与i有关的可算的数字: 然后把它放到二维坐标轴上,用单调队列维护一个凸壳,O(n)的复杂度: 这道题但是我发 ...