找出数组中每个元素相对其他元素的大小

题目可能表述不是十分清楚,举个例子。

假设一个数组,元素分别是3 9 2 1 8 3 2,需要输出3 5 2 1 4 3 2,输出中的3表示元素3在数组所有的元素中是排在第三位的,比1 2 大,5表示9在数组所有的元素中是排在第五位的,也就是最大的。

思路:首先想到的是可不可以通过各种各样的排序方法解决这个问题,我们知道在排序的时候,元素的位置信息是不被保留的,但是这里的输出要求按元素在数组中原始的排列顺序输出。我们可以在排序算法的基础上稍作修改就okay了。下面的实现借鉴了冒泡排序的思想。

import java.io.File;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.Scanner;

/*repeat exception class*/
class RepeatException extends Exception{    

    private static final long serialVersionUID = 1L;

    static String str = "elements can not repeat!!!";

    /*constructor*/
    RepeatException()
    {
        super.printStackTrace();
        System.out.println(str);
    }

}

public class WhatIsMyNumber {
    /**
     *
     * @param al -- ArrayList store elements in original double array
     * @param positionInfo -- ArrayList store position information, for example, al = {1,2,1}
     * then, positionInfo = {0,1,0}, the second 0 means the relative order of this elements is
     * store in the first position of result (return by computeNumber)
     * @return
     */
    public static ArrayList<Double> deleteRepeat(ArrayList<Double> al, ArrayList<Integer> positionInfo){

        ArrayList<Double> temp = new ArrayList<Double>();
        //flag record position information
        int flag = 0;

        for(int i = 0; i < al.size(); i++)
        {
            if(temp.contains(al.get(i)))
            {
                positionInfo.add(temp.indexOf(al.get(i)));
            }
            else
            {
                positionInfo.add(flag);
                flag++;
                temp.add(al.get(i));
            }
        }
        return temp;
    }

    /**
     *
     * @param noRepeatArray ArrayList after delete repeat elements
     * @return return the relative order of every element in noRepeatArray
     * @throws Exception throw exception if repeat elements are found in noRepeatArray
     */
    public static int[] computeNumber(ArrayList<Double> noRepeatArray) throws Exception{

        int[] result = new int[noRepeatArray.size()];
        for(int i = 0; i < result.length; i++)
        {
            result[i] = 1;
        }

        for(int i = 0; i < noRepeatArray.size(); i++)
        {
            for(int j = i+1; j < noRepeatArray.size(); j++)
            {
                if(noRepeatArray.get(i) < noRepeatArray.get(j))
                    result[j]++;
                if(noRepeatArray.get(i) > noRepeatArray.get(j))
                    result[i]++;
                if(noRepeatArray.get(i) == noRepeatArray.get(j))
                    throw new RepeatException();
            }
        }

        return result;
    }

    public static void outputResult(double[] test){

        double[] output = new double[test.length];
        ArrayList<Double> al = new ArrayList<Double>();
        ArrayList<Integer> positionInfo = new ArrayList<Integer>();
        for(int i = 0; i < test.length; i++)
        {
            al.add(test[i]);
        }

        al = deleteRepeat(al,positionInfo);
        try
        {
            int[] result = computeNumber(al);
            for(int i = 0; i < output.length; i++)
            {
                output[i] = result[positionInfo.get(i)];
                System.out.print(output[i] + " ");
            }

            System.out.println();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

    public static void main(String[] args){

        double[] test = new double[]{8,8,8,2.5,8,8,2.5,8,13,15,12,2.5,15,2.5,8,15};
        outputResult(test);
    }
下面来说说程序的主要思想。给定一个数组,假设是{5,2,4,1},输出数组初始化为{1,1,1,1},然后5和2比较,5>2,输出数组变为{2,1,1,1},5和4比较,5>4,输出数组变为{3,1,1,1},5和1比较,5>1,输出数组变为{4,1,1,1},这是一轮,下一轮,2分别与4和1比较,最后是4和1比较。最后输出数组是{4,2,3,1}。

如果数组中存在重复的元素,两个一样大小的元素得到的relative order可能是不一致的,所以在实现的时候书写了deleteRepeat这样一个函数,并且用positionInfo来保存位置信息。
				
时间: 2024-08-28 08:39:58

找出数组中每个元素相对其他元素的大小的相关文章

找出数组中出现次数超过一半的元素

题目:找出数组中出现次数超过一半的元素 解法:每次删除数组中两个不同的元素,删除后,要查找的那个元素的个数仍然超过删除后的元素总数的一半 #include <stdio.h> int half_number(int a[], int n) { if( a == NULL || n <= 0 ) return -1; int i, candidate; int times = 0; for( i=0; i<n; i++ ) { if( times == 0 ) { candidate

找出数组中出现奇数次的元素

题目1: 给定一个含有n个元素的整形数组,其中只有一个元素出现奇数次,找出这个元素 异或 题目2: 如果题目1中有两个数出现了奇数次,并且这两个数并不相等,如何在O(1)的复杂度内找出这两个数 假设这两个数为a,b 异或结果为x.问题是我们如何能够通过x得到a,b. 因为x不为0,所以x的二进制肯定有一位为1. 例如x的二进制为001001,那么我们只需要一个不为0的那个.k=1(或者k=4)意味着a或者b中有一个第k位位1,所以我们再到数组中寻找所有k=1位为1的所有数,并将他们和x进行异或.

Java实现找出数组中重复次数最多的元素以及个数

/**数组中元素重复最多的数 * @param array * @author shaobn * @param array */ public static void getMethod_4(int[] array){ Map<Integer, Integer> map = new HashMap<>(); int count = 0; int count_2 = 0; int temp = 0; for(int i=0;i<array.length;i=i+count){

c语言代码编程题汇总:找出字符串中与输入的字母元素相同的个数以及其所对应数组的下标值

找出字符串中与输入的字母元素相同的个数以及其所对应数组的下标值 程序代码如下: 1 /* 2 2017年3月8日08:39:16 3 功能:找出字符串中与输入的字母元素相同的个数以及其所对应数组的下标值 4 */ 5 6 #include"stdio.h" 7 int main (void) 8 { 9 int i = 0, j = 0; 10 char a[100]; 11 char ch; 12 int num = 0; 13 14 printf ("please inp

442. 找出数组中重复的元素 Find All Duplicates in an ArrayGiven an array of integers

Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once. Find all the elements that appear twice in this array. Could you do it without extra space and in O(n) runtime? Example: Input: [4,3,2,7,

算法之找出数组中出现次数大于n/m的元素

最经典的题目莫过于是: 在一个数组中找出出现次数超过n/2的元素?更进一步的,找出数组中出现次数大于n/3的所有元素? 注:这里有一个很重要的事实,那就是出现次数大于n/m的元素的个数至多为(m-1)个,比如出现次数大于n/3的至多只有两个. 关于这一类题目的解题思路,可以先讲一个游戏 称作 "俄罗斯方块".这里的规则是每一行的元素要完全不一样,一样的元素则总是在同一列,如果最下面的行已经被填满,那么消除最下面的行. 例如在数组 A = {7,3,3,7,4,3,4,7,3,4,3,4

找出数组中唯一的重复元素

[问题] 1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次. 每个数组元素只能访问一次,设计一个算法,将它找出来:不用辅助存储空间,能否设计一个算法实现? [代码] #include <stdio.h> #include <stdlib.h> #include <string.h> /*根据异或法的计算方式,每两个相异的数执行异或运算之后,结果为1: 每两个相同的数异或之后,结果为0,任何数与0异或,结果仍为自身. 所以数组a[N]

1142: 零起点学算法49——找出数组中最大元素的位置(下标值)

1142: 零起点学算法49--找出数组中最大元素的位置(下标值) Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 1937  Accepted: 977[Submit][Status][Web Board] Description 找出数组中最大的元素的下标. Input 多组测试,每组先输入一个不大于10的整数n 然后是n个整数 Output 输出这n个整数中最大的元素及下标值 Sample I

9.11排序与查找(三)——给定一个排序后的数组,包含n个整数,但这个数组已被旋转过多次,找出数组中的某个元素

/** * 功能:给定一个排序后的数组,包含n个整数,但这个数组已被旋转过多次,次数不详.找出数组中的某个元素. * 可以假定数组元素原先是按从小到大的顺序排列的. */ /** * 思路:数组被旋转过了,则寻找拐点. * @param a * @param left * @param right * @param x:要搜索的元素 * @return */ public static int search(int[] a,int left,int right,int x){ int mid=(

找出数组中每个数右边第一个比它大的元素

题目 找出数组中每个数右边第一个比它大的元素. 思路 暴力解法 单调栈 使用栈结构.从前往后遍历数组每一位时,利用栈更新这一位之前每一位上的数的"右边第一个比它大的元素". 代码 public static int[] findMaxRightWithStack(int[] array) { if(array == null) return null; int n = array.length; int[] ret = new int[n]; Stack<Integer>