任意给定一个大于等于10的整数A,请写一程序,以最小的时间复杂度找出比A小并且最接近A的一个整数B。要求:A的每位之和与B的每位之和相等 例:如果A=123 那么B=114
2012-10-05 12:02
666 查看
自己所写没有凭据,但自己想到的测试没错,若有错希望大家指出。(类似123000这种情况源码中未写,但思路给出。相信这不是啥难题)。
思路:
原始输入oriNum,最终数endNum
if(oriNum % 10 !=9 && oriNum % 100 !=0)
endNum = oriNum -9;
else if(oriNum % 100 ==0)
1.找到第一个不为0的数位a(将其减一);
2.a的下一位加一
3.其余位不变
else(处理类似1234999这种末位有几位9的情况){
设置两个标志位flag1(末位含9的位数)和flag2(输入数据位数)
if(flag1 == flag2 || flag1 ==(flag2-1))
System.out.println("抱歉,您输入的数字无解");
else{
oriNum的第flag1+2位变为原数减一
oriNum的第flag1+1至倒数第二位变为9
oriNum的末位变为flag1+1位的数据+1
}
}
代码:
package com.donghao;
import java.util.Scanner;
public class HeXiangtong {
public static void main(String[] args){
System.out.println("请输入一个大于10的整数");
Scanner scan = new Scanner(System.in);
int oriNum = scan.nextInt();
int lastNum=0;
int[] arr = new int[100];//存取oriNum的逆序
int[] endArr;//记录oriNum转换后的值,仍未倒序,此处倒着读取
int i=0;//便于给arr赋值
int flag1=0,flag2=0;//标识原数子有几个九,如果有flag1=flag2个则无解
int length=0;//所给数据位数
//最简单的数处理方式129934
if(oriNum % 10 !=9 && oriNum % 100 !=0){
lastNum = oriNum -9;
System.out.println("The Nearest number is:" + lastNum);
}
//143000->000431(思路最初不为0的数位减1,末位加1)
else if(oriNum % 100 ==0){
int power =1;
while(oriNum % 10 == 0){
oriNum /= 10;
power = power * 10;
}
oriNum = oriNum -1;
lastNum = oriNum * power + (power / 10);
System.out.print("The Nearest number is:" + lastNum);
}
//类似于199999这种情况
else{
//取最左边9的个数和数据位数
while(true){
if(oriNum % 10 == 9){
flag1++;
flag2++;
arr[i++] = 9;
}
if(oriNum % 10 !=9){
flag2++;
arr[i++] = oriNum % 10;
}
oriNum = oriNum / 10;
if(oriNum <1){
arr[i] =oriNum;
break;
}
}
length = flag2;
for(int j=0;j<length;j++){
System.out.print(arr[j] + " ");
}
System.out.println("flag1=" + flag1);
System.out.println("flag2=" + flag2);
//处理类似于199999这种情况
if(flag1 == flag2 || flag1 ==(flag2-1))
System.out.println("抱歉,您输入的数字无解");
//类似于123999这种情况
else{
endArr = new int[length];
endArr[0] = arr[flag1]+ 1;
for(int k=1;k<length;k++){
if(k<=flag1){
endArr[k] = arr[k-1];
}else if(k==(flag1+1)){
endArr[k] =arr[flag1 +1] -1;
}
else{
endArr[k] = arr[k];
}
}
System.out.print("最终结果");
for(int j=length-1;j>=0;j--){
System.out.print(endArr[j]);
}
}
}
}
}
思路:
原始输入oriNum,最终数endNum
if(oriNum % 10 !=9 && oriNum % 100 !=0)
endNum = oriNum -9;
else if(oriNum % 100 ==0)
1.找到第一个不为0的数位a(将其减一);
2.a的下一位加一
3.其余位不变
else(处理类似1234999这种末位有几位9的情况){
设置两个标志位flag1(末位含9的位数)和flag2(输入数据位数)
if(flag1 == flag2 || flag1 ==(flag2-1))
System.out.println("抱歉,您输入的数字无解");
else{
oriNum的第flag1+2位变为原数减一
oriNum的第flag1+1至倒数第二位变为9
oriNum的末位变为flag1+1位的数据+1
}
}
代码:
package com.donghao;
import java.util.Scanner;
public class HeXiangtong {
public static void main(String[] args){
System.out.println("请输入一个大于10的整数");
Scanner scan = new Scanner(System.in);
int oriNum = scan.nextInt();
int lastNum=0;
int[] arr = new int[100];//存取oriNum的逆序
int[] endArr;//记录oriNum转换后的值,仍未倒序,此处倒着读取
int i=0;//便于给arr赋值
int flag1=0,flag2=0;//标识原数子有几个九,如果有flag1=flag2个则无解
int length=0;//所给数据位数
//最简单的数处理方式129934
if(oriNum % 10 !=9 && oriNum % 100 !=0){
lastNum = oriNum -9;
System.out.println("The Nearest number is:" + lastNum);
}
//143000->000431(思路最初不为0的数位减1,末位加1)
else if(oriNum % 100 ==0){
int power =1;
while(oriNum % 10 == 0){
oriNum /= 10;
power = power * 10;
}
oriNum = oriNum -1;
lastNum = oriNum * power + (power / 10);
System.out.print("The Nearest number is:" + lastNum);
}
//类似于199999这种情况
else{
//取最左边9的个数和数据位数
while(true){
if(oriNum % 10 == 9){
flag1++;
flag2++;
arr[i++] = 9;
}
if(oriNum % 10 !=9){
flag2++;
arr[i++] = oriNum % 10;
}
oriNum = oriNum / 10;
if(oriNum <1){
arr[i] =oriNum;
break;
}
}
length = flag2;
for(int j=0;j<length;j++){
System.out.print(arr[j] + " ");
}
System.out.println("flag1=" + flag1);
System.out.println("flag2=" + flag2);
//处理类似于199999这种情况
if(flag1 == flag2 || flag1 ==(flag2-1))
System.out.println("抱歉,您输入的数字无解");
//类似于123999这种情况
else{
endArr = new int[length];
endArr[0] = arr[flag1]+ 1;
for(int k=1;k<length;k++){
if(k<=flag1){
endArr[k] = arr[k-1];
}else if(k==(flag1+1)){
endArr[k] =arr[flag1 +1] -1;
}
else{
endArr[k] = arr[k];
}
}
System.out.print("最终结果");
for(int j=length-1;j>=0;j--){
System.out.print(endArr[j]);
}
}
}
}
}
相关文章推荐
- 小易邀请你玩一个数字游戏,小易给你一系列的整数。你们俩使用这些整数玩游戏。每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字。 例如: 如果{2,1,2,7}是你有的一系列数,小易说的数字是11.你可以得到方案2+2+7 = 11.如果顽皮的小易想坑你,他说的数字是6,那么你没有办法拼凑出和为6 现在小易给你n个数,让你找出无法从n个数中选取部分求和
- 长度为n的整数数组,找出其中任意(n-1)个乘积最大的那一组,只能用乘法,不可 以用除法。要求对算法的时间复杂度和空间复杂度作出分析,可以写思路也可以写程序。
- 给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- 百度笔试:给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。 要求:空间复杂度O(1),时间复杂度为O(n)
- 给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。要求:空间复杂度O(1),时间复杂度为O(n)
- 写出一个程序,接受一个浮点数值,输出该数值的近似整数值。如果小数点后数值大于等于5,向上取整;小于5,则向下取整
- 一棵排序二叉树,令 f=(最大值+最小值)/2,设计一个算法,找出距离f值最近、大于f值的结点。 复杂度如果是O(n2)则不得分。
- 谷歌笔试题--给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- 给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- 谷歌笔试题--给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- 给定一个字符串和一个整数k,对字符串开头算起的每2k个字符的前k个字符进行反转。 如果还有少于k个字符,则将其全部撤消。 如果小于2k但大于或等于k个字符,则反转前k个字符,
- 给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。 要求:空间复杂度O(1),时间复杂度为O(n)。
- 给定任意一个整数,找出比当前这个数大的最小的10个素数之和。
- 4.给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。 要求:空间复杂度O(1),时间复杂度为O(n)
- 一个整型数组里除了一个或者两个或者三个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)
- 一棵排序二叉树,令 f=(最大值+最小值)/2, 设计一个算法,找出距离f 值最近、大于f 值的结点。 复杂度如果是O(n2)则不得分
- 一个整型数组里除了一个或者两个或者三个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)
- 对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。
- 定义一个栈的数据结构,要求实现一个min函数,每次能够得到栈的最小值,并且要求Min的时间复杂度为O(1)
- 对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。