有1到100个数字,将这些数字随机放到长度为100的数组中,其中有任意一个数字被1到100之外的数字替换,请找出被替换的数字

yidichaxiang 2014-02-13 12:36:33
加精
问:有1到100个数字,将这些数字随机放到长度为100的数组中,其中有任意一个数字被1到100之外的数字替换,请找出被替换的数字?
要求不能对数组排序
算法题,要求效率,特别优秀的另开贴加分
...全文
10171 83 打赏 收藏 转发到动态 举报
写回复
用AI写文章
83 条回复
切换为时间正序
请发表友善的回复…
发表回复
丨徘徊灬 2015-04-29
  • 打赏
  • 举报
回复
真的不懂 求解
一天十小时 2015-03-30
  • 打赏
  • 举报
回复
如果是多个的话,可以开辟一个大小为100的数组a, 先遍历需处理的数组,符合[1,100]的数据放到a里数字对应的索引位置。 再遍历a,如果a[i]为空的,则i就是要找的数了。 时间复杂度和空间复杂度都是O(n)
一天十小时 2015-03-30
  • 打赏
  • 举报
回复
引用 1 楼 yidichaxiang 的回复:
算法一: 首先需要一个额外的存储空间,设变量totaolSum; 设无序数组为 intArray 长度100; 核心算法如下:
	totaolSum=0;
	for(int i=0;i<100;i++)   
     { 
		if(intArray[i]>0 && intArray[i]<=100)
		{
			totaolSum = totaolSum + intArray[i];
		}
     }
	
(5050-totaolSum) 就是要查找的被替换的数字 这个算法的时间复杂度O(n),空间复杂度O(1)
5050还是得遍历一下得出来才行,要不换一遍数据还是要算. 不过时间复杂度还是O(n)
kyxw007 2015-03-23
  • 打赏
  • 举报
回复
引用 39 楼 EcisJi 的回复:
[quote=引用 38 楼 EcisJi 的回复:] 100个数,循环200次就行了!!!坐等奖励! public static void main(String[] args) { //该算法循环的次数为:2 * n,n为数据量。 int[] past = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};//100太多了,写太累,1-10作为例子吧 int[] arr = {5, 9, 1, 3, 5, 7, 10, 4, 6, 8};//4替换了2 int productB = 1;//替换后的乘积 int sumB = 0;//替换后的和 for(int i = 0; i < arr.length; i++){ productB *= arr[i]; sumB += arr[i]; } int productA = 1;//替换之前的乘积 int sumA = 0;//替换之前的和 for(int i = (past.length - 1); i >= 0; i--){//倒序遍历,才能保证约分完全! //替换前后的乘积进行约分 if((productB % past[i]) == 0){ productB /= past[i]; } else{ productA *= past[i]; } sumA += past[i]; } int replace = 0; int diff = sumA - sumB; if(sumB > sumA){ diff = sumB - sumA; } //约分后,有一个是1,说明是倍数关系:x = n/(k - 1);n是和的增量,k是乘积的倍数 if(productA == 1){ replace = diff / (productB - 1); } else if(productB == 1){ replace = diff / (productA - 1); } else { //约分后,如果都是大于1,留下来的就是替换了的 replace = productA; } System.out.println("被替换的数为:" + replace); }
不好意思,写错了,是“5替换了2”。[/quote] 请问大神,如果有两个数被替换了呢?
fighting_for_dream 2014-12-26
  • 打赏
  • 举报
回复
public static void main(String[] args) { Random random = new Random(0); int nextInt = 0; HashMap<Integer, Integer> hashMap = new HashMap<Integer, Integer>(); for (int i = 1; i < 101; i++) { nextInt = random.nextInt(101); if (hashMap.containsKey(nextInt)) { System.out.println(i + "替换了" + hashMap.get(nextInt)); } hashMap.put(nextInt, i); } } 不知道这个是算法么
yidichaxiang 2014-08-06
  • 打赏
  • 举报
回复
即1到100随机放到数组里,无序,其中某一个数被替换,即55被1000替换,要求的就是55,不是1000 我给除了算法,想要更高的,不能排序好多都违反这个原则了
yidichaxiang 2014-08-06
  • 打赏
  • 举报
回复
题意是:有1到100个数字,将这些数字随机放到长度为100的数组中,其中有任意一个数字被1到100之外的数字替换,请找出被替换的数字?
豫让_______ 2014-08-05
  • 打赏
  • 举报
回复
int findNum(int[] n){
		int sum = 0;
		for (int i = 0; i < n.length; i++) {
			sum+=n[i];
		}
		return sum - 5050;
		
	}
陆荃 2014-02-26
  • 打赏
  • 举报
回复
应该这样,可以避免原数组有重复的数字的情况。但如果有多个数字被修改的情况还不能解决。 package com.luquan.myjava.bianchengti; import java.util.Arrays; import java.util.Random; /** * 有1到100个数字,将这些数字随机放到长度为100的数组中,其中有任意一个数字被1到100之外的数字替换,请找出被替换的数字 * * @author yuluquan * */ public class FindSpecialNum { private static final int LENGTH = 100; public static void main(String[] args) { int[] iArr = new int[LENGTH]; Random rand = new Random(); for (int i = 0; i < iArr.length; i++) { iArr[i] = rand.nextInt(1000); } int[] otherArr = iArr.clone(); otherArr[rand.nextInt(LENGTH)] = 1024; System.out.println(Arrays.toString(iArr)); System.out.println(Arrays.toString(otherArr)); int findNum = find(iArr, otherArr); int index = 0; for (int i = 0; i < otherArr.length; i++) { if (otherArr[i] == findNum) { index = i; break; } } System.out.println("被替换的数字是[" + index + "] : " + iArr[index]); System.out.println("替换的数字是 [" + index + "] : " + findNum); } /** * 二分查找法 * * @param iArr * @param otherArr * @return 被替换的数 */ private static int find(int[] iArr, int[] otherArr) { int len = iArr.length; if (len == 1) { return otherArr[0]; } // 除二取中 int mid = len >> 1; int sum = 0; int otherSum = 0; for (int i = 0; i < mid; i++) { sum += iArr[i]; otherSum += otherArr[i]; } if (sum != otherSum) { return find(Arrays.copyOf(iArr, mid), Arrays.copyOf(otherArr, mid)); } else { return find(Arrays.copyOfRange(iArr, mid, len), Arrays.copyOfRange(otherArr, mid, len)); } } }
陆荃 2014-02-26
  • 打赏
  • 举报
回复
不好意思,更正一下程序 package com.luquan.myjava.bianchengti; import java.util.Arrays; import java.util.Random; import org.apache.commons.lang.ObjectUtils; /** * 有1到100个数字,将这些数字随机放到长度为100的数组中,其中有任意一个数字被1到100之外的数字替换,请找出被替换的数字 * * @author yuluquan * */ public class FindSpecialNum { private static final int LENGTH = 100; public static void main(String[] args) { int[] iArr = new int[LENGTH]; Random rand = new Random(); for (int i = 0; i < iArr.length; i++) { iArr[i] = rand.nextInt(1000); } int[] otherArr = iArr.clone(); otherArr[rand.nextInt(LENGTH)] = 1024; System.out.println(Arrays.toString(iArr)); System.out.println(Arrays.toString(otherArr)); int findNum = find(iArr, otherArr, iArr); int index = 0; for (int i = 0; i < otherArr.length; i++) { if (iArr[i] == findNum) { index = i; break; } } System.out.println("被替换的数字是[" + index + "] : " + findNum); System.out.println("替换的数字是 [" + index + "] : " + otherArr[index]); } /** * 二分查找法 * * @param iArr * @param otherArr * @param oldArr * @return 被替换的数 */ private static int find(int[] iArr, int[] otherArr, int[] oldArr) { int len = iArr.length; if (len == 1) { return iArr[0]; } // 除二取中 int mid = len >> 1; int sum = 0; int otherSum = 0; for (int i = 0; i < mid; i++) { sum += iArr[i]; otherSum += otherArr[i]; } if (sum != otherSum) { return find(Arrays.copyOf(iArr, mid), Arrays.copyOf(otherArr, mid), oldArr); } else { return find(Arrays.copyOfRange(iArr, mid, len), Arrays.copyOfRange(otherArr, mid, len), oldArr); } } }
陆荃 2014-02-26
  • 打赏
  • 举报
回复
引用 68 楼 A971319231 的回复:
[quote=引用 32 楼 redcenter 的回复:] [quote=引用 26 楼 gw816 的回复:] [quote=引用 7 楼 miraclestar 的回复:]

    for(int i=0;i<100;i++)   
     { 
        if(intArray[i]<1 || intArray[i]>100)
        {
            就是这个了啊;
            break;
        }
     }
搞不懂lz在想啥?
被数据替换,人家告诉你这个数据大于100了?是任意的好不?[/quote] 楼主题干:其中有任意一个数字被1到100之外的数字替换。 1到100之外的数不就是小于1或者大于100的数吗。[/quote] 这里面的1到100应该是说数据,而不是真实的数据是1到100吧?[/quote] 仔细看下题目,确如A971319231所说,试写一程序如下,希切题意: package com.luquan.myjava.bianchengti; import java.util.Arrays; import java.util.Random; import org.apache.commons.lang.ObjectUtils; /** * 有1到100个数字,将这些数字随机放到长度为100的数组中,其中有任意一个数字被1到100之外的数字替换,请找出被替换的数字 * * @author yuluquan * */ public class FindSpecialNum { private static final int LENGTH = 100; public static void main(String[] args) { int[] iArr = new int[LENGTH]; Random rand = new Random(); for (int i = 0; i < iArr.length; i++) { iArr[i] = rand.nextInt(1000); } int[] otherArr = iArr.clone(); otherArr[rand.nextInt(LENGTH)] = 1024; System.out.println(Arrays.toString(iArr)); System.out.println(Arrays.toString(otherArr)); int specialNum = find(iArr, otherArr); int index = 0; for (int i = 0; i < otherArr.length; i++) { if (otherArr[i] == specialNum) { index = i; break; } } System.out.println("被替换的数字是位置为" + index + "的" + specialNum); } // 二分查找法 private static int find(int[] iArr, int[] otherArr) { int len = iArr.length; if (len == 1) { return otherArr[0]; } // 除二取中 int mid = len >> 1; int sum = 0; int otherSum = 0; for (int i = 0; i < mid; i++) { sum += iArr[i]; otherSum += otherArr[i]; } if (sum != otherSum) { return find(Arrays.copyOf(iArr, mid), Arrays.copyOf(otherArr, mid)); } else { return find(Arrays.copyOfRange(iArr, mid, len), Arrays.copyOfRange(otherArr, mid, len)); } } }
langtaosha1238 2014-02-25
  • 打赏
  • 举报
回复
引用 61 楼 liwei960067495 的回复:
遍历数组。找到唯一的那个不在1-100间的数字,并获得总和,总和与5050之差就是被替换与替换数之差,这样你就可以获得被替换的数字
+1 代码:
int sum=0,otherdata=0,dirdata; for(int i=0;i<100;i++) { if(arry[i]>0&&arry[i]<=100) { sum=sum+arry[i]; } else otherdata=arry[i]; } dirdata=5050-sum; printf("the data is %d",dirdata);
wsyswt 2014-02-24
  • 打赏
  • 举报
回复
都好厉害啊,学习学习
E8software 2014-02-24
  • 打赏
  • 举报
回复
谢谢分享,学习了
A971319231 2014-02-24
  • 打赏
  • 举报
回复
引用 68 楼 A971319231 的回复:
[quote=引用 32 楼 redcenter 的回复:] [quote=引用 26 楼 gw816 的回复:] [quote=引用 7 楼 miraclestar 的回复:]

    for(int i=0;i<100;i++)   
     { 
        if(intArray[i]<1 || intArray[i]>100)
        {
            就是这个了啊;
            break;
        }
     }
搞不懂lz在想啥?
被数据替换,人家告诉你这个数据大于100了?是任意的好不?[/quote] 楼主题干:其中有任意一个数字被1到100之外的数字替换。 1到100之外的数不就是小于1或者大于100的数吗。[/quote] 这里面的1到100应该是说数据,而不是真实的数据是1到100吧?[/quote] 说错,这里面的1到100应该是说数组,而不是真实的数据是1到100吧?
A971319231 2014-02-24
  • 打赏
  • 举报
回复
引用 32 楼 redcenter 的回复:
[quote=引用 26 楼 gw816 的回复:] [quote=引用 7 楼 miraclestar 的回复:]

    for(int i=0;i<100;i++)   
     { 
        if(intArray[i]<1 || intArray[i]>100)
        {
            就是这个了啊;
            break;
        }
     }
搞不懂lz在想啥?
被数据替换,人家告诉你这个数据大于100了?是任意的好不?[/quote] 楼主题干:其中有任意一个数字被1到100之外的数字替换。 1到100之外的数不就是小于1或者大于100的数吗。[/quote] 这里面的1到100应该是说数据,而不是真实的数据是1到100吧?
南郊居士 2014-02-24
  • 打赏
  • 举报
回复
我表示,木有看懂。。。。
代码员 2014-02-24
  • 打赏
  • 举报
回复
我也来看看。看着有点明白的意思。
xusir98 2014-02-24
  • 打赏
  • 举报
回复
代码间的舞者 2014-02-23
  • 打赏
  • 举报
回复
引用 63 楼 Android_iPhone 的回复:
提示一个点,最好能得点儿分 考虑一下原题: 如果仅有1个数,那么这个数就是被置换的数,直接输出它就OK了; 如果仅有2个数,那么顺次判断时,如果第1个数是范围内的数,马上就知道后面那个数是范围外的数了; 反过来,如果第1个数不是范围内的数,马上就知道后面那个数是范围内的数了。 以此类推,100个数肯定不需要100次判断或者计算 而应该在第99次上决断出来最终结果
按照这个思路,只能定位第几个数字被替换,而不知道被替换的数值吧。
加载更多回复(52)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧