`
HUYIZIZHEN
  • 浏览: 114078 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

关于淘宝2011笔试题的解答!!!

 
阅读更多
import java.util.List;
import java.util.ArrayList;


public class IntArray
    {
        //这是整型数组类(IntArray)的数据成员 ,即一个整型数组
        public int[] data;

        //此类的构造函数法
        public IntArray(int[] a)
        {
            data = a;
        }

        //打印数组,每十个一行
        public void printArray()
        {
            int i = 0;
            for (int j: data)
            {
                System.out.println(" " + j);
                i++;
                if (i % 10 == 0)
                	System.out.println();
            }
        }

         
        //给定一个整数数组,从中切出一个连续片段,保证其元素和最大
        public ArraySession sliceMax()
        {
            int dataLength = this.data.length;//缓存数组长度

            //判断数组内是否有正整数,如果没有返回最大的非正数
            int flag = 0;
            for (int i = 0; i < dataLength; ++i)
            {
                if (data[i] > 0)
                    break;
                ++flag;
            }

            if (flag == dataLength)
            {
                int max1 = data[0], index = 0;

                for (int i = 0; i < dataLength; ++i)
                {
                    if (data[i] >= max1)
                    {
                        max1 = data[i];
                        index = i;
                    }
                }
                return new ArraySession(index, index, max1);//全为非正数时,一定从这一句返回。
            }

            //下面是对数组内有正整数的情况考虑的
            List<ArraySession> node = new ArrayList<ArraySession>();

            for (int start = 0; start < dataLength; start++)
            {
                if (data[start] <= 0 || start != 0 && data[start - 1] > 0)
                    continue;//起始点是非正数的或者前一个数是正数的,肯定不是最大序列,继续下一轮
                for (int end = start; end < dataLength; end++)
                {
//System.out.println((data[end] <= 0 || end < dataLength -1 && data[end + 1] > 0));
                    if (data[end] <= 0 || end < dataLength -1 && data[end + 1] > 0)//先判断这个数是否为非正,再看下一个是否为正
                        continue;//终止点是非正数的或者 下一个点是正数的,肯定不是最大序列,继续下一轮
                    int sum = 0;
                    for (int k = start; k <= end; k++)
                    {
                        sum = sum + data[k];
                    }
//System.out.println(start+"---"+end+"---sum:"+sum);
                    node.add(new ArraySession(start, end, sum));
                }
            }

            int max2 = node.get(0).sum;
            ArraySession result=null;
            for(ArraySession i:node)
            {
                if (max2 <= i.sum)//此处的等于很重要
                {
                    max2 = i.sum;
                    result = i;
                }
            }
            return result;
        }
    }



public class ArraySession
    {
        public int start;
        public int end;
        public int sum;
        
        //构造函数
        public ArraySession(int start, int end, int sum)
        {
            this.start = start;
            this.end = end;
            this.sum = sum;
        }

        //打印此段的基本信息
        public void sessionPrint()
        {
            System.out.println("此段的开端索引值为:start="+start);
            System.out.println("此段的结尾索引值为:end="+end);
            System.out.println("此段的元素之和为:sum="+sum);
        }
    }





public class MainClass
    {
        //主函数 ,程序的入口点 ,此类主要用作调试函数
       public static void main(String[] args)
        {
            //int[] array ={ -1, 3, -1, -2, 1, -1, 5, -6,-7, -8 };
            //new IntArray(new Mathlet().arrayMultiMax(array)).printArray();

            //Console.WriteLine(new Mathlet().triFibonacci(BasicFunctions.intInput("请输入一个整数")));
            //Console.ReadKey();

            //new ArraySession(1, 2, 3).sessionPrint();

            int[] array = { 1, -7, 0, 2, -3, 4, -2, 6, -7, -8 };

            new IntArray(array).sliceMax().sessionPrint();

            
        }
    }



注:本代码是本人的java改进版,源代码为C#的 参考 牟盖东 先生的!
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics