京东软开2015笔试:寻找满足条件的整数

题目大意:

给出整数N(0 ≤ N ≤ 10^9),找出一个最小的整数Q,使得将Q的每一位相乘之后等于N

比如N=18,则Q可能取值为:29(2×9=18),36(3×6=18),63(6×3=18),92(9×2=18)

那么我们仅仅要取最小值29即为结果 输入:整数N(0 ≤ N ≤ 10^9) 输出:假设存在这种Q,则输出Q。假设不存在,输出-1

package com.liuhao.acm.exam;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @author liuhao 给出整数N(0 ≤ N ≤ 10^9),找出一个最小的整数Q,使得将Q的每一位相乘之后等于N
 *         比如N=18,则Q可能取值为:29(2×9=18),36(3×6=18),63(6×3=18),92(9×2=18)
 *         那么我们仅仅要取最小值29即为结果 输入:整数N(0 ≤ N ≤ 10^9) 输出:假设存在这种Q,则输出Q,假设不存在,输出-1
 */
public class NewIntProduct {

	public static int getNew(int input) {
		// 若该数是各位数,那么最小的肯定是1X该数
		if (input >= 0 && input <= 9) {
			return 10 + input;
		}

		List<Integer> list = new ArrayList<Integer>();// 存放满足要求的乘数

		list = getNew(input, list);// 递归获取

		// 若list中含有-1,说明初始数input本身或者input的约数不满足条件
		if (list.contains(-1)) {
			return -1;
		}

		// 将list排序
		Collections.sort(list);

		int len = list.size();

		int result = 0;// 终于的返回值

		// 依据list中的各位数拼成终于的返回值
		for (int i = len - 1; i >= 0; i--) {
			result += Math.pow(10, len - 1 - i) * list.get(i);
		}

		return result;
	}

	/**
	 * @param n
	 *            初始数
	 * @param list
	 *            满足要求的乘数
	 * @return
	 */
	private static List<Integer> getNew(int n, List<Integer> list) {

		// 若初始数已经是一个个位数,则直接加入到list中,并跳出递归
		if (n >= 0 && n <= 9) {
			list.add(n);
			return list;
		}

		boolean flag = false;// 是否存在个位数的约数的标志

		// 依次用9-2,作为除数,看初始数是否存在个位数的约数
		for (int i = 9; i >= 2; i--) {
			// 若存在
			if (n % i == 0) {
				flag = true;
				list.add(i);// 将该约束加入到list中
				getNew(n / i, list);// 递归查找商数的满足条件的约束
				break;
			}
		}

		// 不存在,说明不满足条件
		if (!flag) {
			list.add(-1);
		}

		return list;
	}

	public static void main(String[] args) {
		System.out.println(getNew(18));
	}
}
时间: 2024-08-25 01:51:58

京东软开2015笔试:寻找满足条件的整数的相关文章

小米2015笔试编程题

小米2015笔试编程题 1.[编程题] 懂二进制 时间限制:1秒 空间限制:32768K 世界上有10种人,一种懂二进制,一种不懂.那么你知道两个int32整数m和n的二进制表达,有多少个位(bit)不同么? 输入例子1: 1999  2299 输出例子1: 7 分析:第一步求这两个数的异或,得到一个新的数,相同位是0,不同位是1:第二步采用位运算求这个数里边1的个数即为结果 1 class Solution { 2 public: 3 /** 4 * 获得两个整形二进制表达位数不同的数量 5

快速寻找满足条件的两个数

时间:2014.07.17 地点:基地 ------------------------------------------------------------------------------------- 一.问题描述 给定一个数组,要求快速查找出其中的两个值,他们的和为一个给定的值. 比如给定数组:1 4 5 6 8  9,和给定值9,我们能找出4+5=9为所要的数值 ------------------------------------------------------------

编程之美2.12 高速寻找满足条件的两个数

  这道题目的意思是,在一个数组中寻找两个数.使这两个数的和等于给定的数(找到随意一组就能够了).       题目读完之后,感觉这道题目还是非常easy的.就是遍历数组呗,走两遍,即能够在O(n2)时间复杂度内解决问题. 只是,细致想想之后.复杂度还是能够减少的.       首先,我们能够对数组进行排序,这样,得到的数组就是一个有序数组(如果数组是递增的).那么,我们能够利用两个指针.一个指针指向数组的第一个元素,一个指针指向数组的最后一个元素.所以,就是两个指针分别指向两个最值.然后前后每

第2章 数字之魅——快速寻找满足条件的两个数

快速寻找满足条件的两个数 问题描述 能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的数字,为了简化起见,我们假设这个数组中肯定存在这样一组或以上符合要求的解. 分析与解法 [解法一] 代码如下: 1 package chapter2shuzizhimei.findtwonumber; 2 /** 3 * 快速寻找满足条件的两个数 4 * [解法一] 5 * @author DELL 6 * 7 */ 8 public class FindTowNumber1 { 9 //定义一个

第2章 数字之魅——找符合条件的整数

找符合条件的整数 问题描述 任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0. 解决这个问题首先考虑对于任意的N,是否这样的M一定存在.可以证明,M是一定存在的,而且不唯一.简单证明:因为 这是一个无穷数列,但是数列中的每一项取值范围都在[0, N-1]之间.所以这个无穷数列中间必定存在循环节.即假设有s,t均是正整数,且s<t,有 .于是循环节长度为t-s.于是10^s = 10^t.因此有:,所以 例如,取N=3,因为10的任何非负次方模3都为

编程之美——符合条件的整数

问题:给定整数N,求最小整数M,使得N*M的十进制表示中只含有1和0: 当M很大时,机器可能不能表示M,对问题转化:求以最小整数X,使得X的十进制表示中只含1和0,并且被N整除: 此问题必定有解:可参考:http://blog.csdn.net/spaceyqy/article/details/38337387 代码实现(具体思路参考编程之美或:http://www.cnblogs.com/jfcspring/p/3776388.html): 1 #include<iostream> 2 #i

编程之美 找出符合条件的整数

好不容易把内容看懂~ 最主要的一句话:只需要将10k%N的结果与余数信息数组里非空的元素相加,再去模N,看看会不会出现新的余数~ 时间太紧迫~先把自己写的代码贴上,以后再详解 1 int FindMin(int N) 2 { 3 if(N <= 1) 4 return N; 5 6 int* A = new int[N];//这个是记录模N余i之后的数值 7 8 memset(A, -1, sizeof(int) * N); 9 int factor = 1; 10 A[1] = 1; 11 1

JavaEE开发之Spring中的条件注解、组合注解与元注解

上篇博客我们详细的聊了<JavaEE开发之Spring中的多线程编程以及任务定时器详解>,本篇博客我们就来聊聊条件注解@Conditional以及组合条件.条件注解说简单点就是根据特定的条件来选择Bean对象的创建.条件注解就是可以根据不同的条件来做出不同的事情.在Spring中条件注解可以说是设计模式中状态模式的一种体现方式,同时也是面向对象编程中多态的应用部分.而组合注解就是将现有的注解进行组合.下方会给出具体的介绍和实例. 一.条件注解[email protected] 本篇博客的本部分

二叉树的非递归遍历--京东2015笔试回忆

题目回忆: C/C++研发试卷:偏重于数据结构的考察,编程题有2题+1题附加题: 1.输入整数n,求m,m>9,m中各个数位的乘积=n的最小整数;如n=36,m=49; 2.二叉树前序遍历的非递归实现(本文的总结) 3.求第n个数,这个序列满足(2^i)*(3^j)*(5^k),前7个为:2,3,4,5,6,8,10 .... 小题有基本的数据结构.程序运行结果.SQL题目. 4.删除表格用DROP命令,死锁产生的条件: 4.1互斥使用(资源独占) 一个资源每次只能给一个进程使用 4.2.不可强