欧拉计划 #11

发布于 2024-11-14 20:50:58 字数 6208 浏览 2 评论 0原文

我最近启动了这些项目来测试我的 Java 技能。我完成了第 11 题,把前面的所有题都做对了。我的代码有问题。返回的答案看起来是正确的,但是我在官网上查看却不是: 问题出在Project Euler #11

这是我的代码。我有几行注释掉的调试行。忽略它们即可。

static String source = "08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48";
//  static String source = "02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00";
static int[] numList = new int[400];
static int answer;

public static void main(String args[]){
    int counter = 1;
    int numListCounter = 0;
    //convert source to array
    for(int x = 0; x < source.length(); x++){
        char[] c = new char[2];
        String s;

        if(counter == 1){
            c[0] = source.charAt(x);
            c[1] = source.charAt(x+1);
            s = new String(c,0,2);
            numList[numListCounter] = Integer.parseInt(s);
        }
        if(counter == 3){
            numListCounter++;
            counter = 0;
        }
        counter++;
    }
    //convert array to grid
    int[][] grid = new int[20][20];
    int c = 0;
    for(int x = 0; x < 20; x++){
        for(int y = 0; y < 20; y++){

            grid[y][x] = numList[c];
            c++;
        }
    }

    //Prints the array. used for testing.
    /*
    for(int y = 0; y < 20; y++){
        for(int x = 0; x < 16; x++){
            System.out.print(grid[x][y] + "\t");
        }
        System.out.println();
    }
    */

    //check horizontal
    int hAnswer = 0;
    for(int y = 0; y < 20; y++){
        for(int x = 0; x < 16; x++){
            if(grid[x][y]*grid[x+1][y]*grid[x+2][y]*grid[x+3][y] > hAnswer){

                hAnswer = grid[x][y]*grid[x+1][y]*grid[x+2][y]*grid[x+3][y];

                //  System.out.println(x + " , " + y);
                //  System.out.println(answer);
            }
        }
    }
    if(hAnswer > answer){
        answer = hAnswer;
    }
    System.out.println(hAnswer + " - Horizontal Answer");

    //check vertical
    int vAnswer = 0;
    for(int x = 0; x < 20; x++){
        for(int y = 0; y < 16; y++){
            if(grid[x][y]*grid[x][y+1]*grid[x][y+2]*grid[x][y+3] > vAnswer){

                vAnswer = grid[x][y]*grid[x][y+1]*grid[x][y+2]*grid[x][y+3];

        //      System.out.println(x + " , " + y);
        //      System.out.println(answer); 
            }
        }
    }
    if(vAnswer > answer){
        answer = vAnswer;
    }
    System.out.println(vAnswer + " - Vertical Answer");

    //check diagonal \
    int d1answer = 0;
    for(int y = 0; y < 16; y++){
        for(int x = 0; x < 16; x++){
            if(grid[x][y]*grid[x+1][y+1]*grid[x+2][y+2]*grid[x+3][y+3] > d1answer){

                d1answer = grid[x][y]*grid[x+1][y+1]*grid[x+2][y+2]*grid[x+3][y+3];

        //      System.out.println(x + " , " + y);
        //      System.out.println(answer);

            }
        }
    }

    if(d1answer > answer){
        answer = d1answer;
    }

    System.out.println(d1answer + " - Diagonal \"\\\" Answer");

    //check diagonal /
    int d2answer = 0;
    for(int y = 3; y < 20; y++){
        for(int x = 3; x < 20; x++){
            if(grid[x][y]*grid[x-1][y-1]*grid[x-2][y-2]*grid[x-3][y-3] > d2answer){

                d2answer = grid[x][y]*grid[x-1][y-1]*grid[x-2][y-2]*grid[x-3][y-3];

        //      System.out.println(x + " , " + y);
        //      System.out.println(answer);
            }
        }
    }
    if(d2answer > answer){
        answer = d2answer;
    }

System.out.println(d2answer + " - Diagonal \"/\" Answer");
System.out.println();
System.out.println(answer + " - Final Answer");
}

如果放入类中,这是可以编译的。我只是不知道为什么这是错误的。

输出:

48477312 - Horizontal Answer
51267216 - Vertical Answer
32719995 - Diagonal "\" Answer
40304286 - Diagonal "/" Answer

51267216 - Final Answer

I recently started these projects to test my skills with Java. I got to problem 11, getting all the previous ones right. There is something wrong with my code. The answer that is returned seems to be correct, but it isn't when I check it on the official website:
The problem is at Project Euler #11.

Here is my code. I have several commented out debugging lines. Just ignore them.

static String source = "08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48";
//  static String source = "02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00";
static int[] numList = new int[400];
static int answer;

public static void main(String args[]){
    int counter = 1;
    int numListCounter = 0;
    //convert source to array
    for(int x = 0; x < source.length(); x++){
        char[] c = new char[2];
        String s;

        if(counter == 1){
            c[0] = source.charAt(x);
            c[1] = source.charAt(x+1);
            s = new String(c,0,2);
            numList[numListCounter] = Integer.parseInt(s);
        }
        if(counter == 3){
            numListCounter++;
            counter = 0;
        }
        counter++;
    }
    //convert array to grid
    int[][] grid = new int[20][20];
    int c = 0;
    for(int x = 0; x < 20; x++){
        for(int y = 0; y < 20; y++){

            grid[y][x] = numList[c];
            c++;
        }
    }

    //Prints the array. used for testing.
    /*
    for(int y = 0; y < 20; y++){
        for(int x = 0; x < 16; x++){
            System.out.print(grid[x][y] + "\t");
        }
        System.out.println();
    }
    */

    //check horizontal
    int hAnswer = 0;
    for(int y = 0; y < 20; y++){
        for(int x = 0; x < 16; x++){
            if(grid[x][y]*grid[x+1][y]*grid[x+2][y]*grid[x+3][y] > hAnswer){

                hAnswer = grid[x][y]*grid[x+1][y]*grid[x+2][y]*grid[x+3][y];

                //  System.out.println(x + " , " + y);
                //  System.out.println(answer);
            }
        }
    }
    if(hAnswer > answer){
        answer = hAnswer;
    }
    System.out.println(hAnswer + " - Horizontal Answer");

    //check vertical
    int vAnswer = 0;
    for(int x = 0; x < 20; x++){
        for(int y = 0; y < 16; y++){
            if(grid[x][y]*grid[x][y+1]*grid[x][y+2]*grid[x][y+3] > vAnswer){

                vAnswer = grid[x][y]*grid[x][y+1]*grid[x][y+2]*grid[x][y+3];

        //      System.out.println(x + " , " + y);
        //      System.out.println(answer); 
            }
        }
    }
    if(vAnswer > answer){
        answer = vAnswer;
    }
    System.out.println(vAnswer + " - Vertical Answer");

    //check diagonal \
    int d1answer = 0;
    for(int y = 0; y < 16; y++){
        for(int x = 0; x < 16; x++){
            if(grid[x][y]*grid[x+1][y+1]*grid[x+2][y+2]*grid[x+3][y+3] > d1answer){

                d1answer = grid[x][y]*grid[x+1][y+1]*grid[x+2][y+2]*grid[x+3][y+3];

        //      System.out.println(x + " , " + y);
        //      System.out.println(answer);

            }
        }
    }

    if(d1answer > answer){
        answer = d1answer;
    }

    System.out.println(d1answer + " - Diagonal \"\\\" Answer");

    //check diagonal /
    int d2answer = 0;
    for(int y = 3; y < 20; y++){
        for(int x = 3; x < 20; x++){
            if(grid[x][y]*grid[x-1][y-1]*grid[x-2][y-2]*grid[x-3][y-3] > d2answer){

                d2answer = grid[x][y]*grid[x-1][y-1]*grid[x-2][y-2]*grid[x-3][y-3];

        //      System.out.println(x + " , " + y);
        //      System.out.println(answer);
            }
        }
    }
    if(d2answer > answer){
        answer = d2answer;
    }

System.out.println(d2answer + " - Diagonal \"/\" Answer");
System.out.println();
System.out.println(answer + " - Final Answer");
}

This is compile-able if put into a class. I just don't know why it is wrong.

Output:

48477312 - Horizontal Answer
51267216 - Vertical Answer
32719995 - Diagonal "\" Answer
40304286 - Diagonal "/" Answer

51267216 - Final Answer

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

肩上的翅膀 2024-11-21 20:50:59
def LI(): return list(map(int, input().split()))


def horizontal(row,col,a):
    if col <= len(a[0])-4:
        return a[row][col] * a[row][col+1] * a[row][col+2] * a[row][col+3]
    else:
        return 0
def vertical(row,col,a):
    if row <= len(a)-4:
        return a[row][col] * a[row+1][col] * a[row+2][col] * a[row+3][col]
    else:
        return 0
def rd(row,col,a):
    if col <= len(a[0])-4 and row <= len(a)-4:
        ans = 1
        ans *= a[row][col]
        ans *= a[row+1][col+1]
        ans *= a[row+2][col+2]
        ans *= a[row+3][col+3]
        return ans
    else:
        return 0
def ld(row,col,a):
    if col >=3 and row <= len(a)-4:
        ans = 1
        ans *= a[row][col]
        ans *= a[row+1][col-1]
        ans *= a[row+2][col-2]
        ans *= a[row+3][col-3]
        return ans
    else:
        return 0

def main(a):
    maxi = 0
    for row in range(len(a)):
        for col in range(len(a[0])):
            maxi = max(maxi,horizontal(row,col,a))
            maxi = max(maxi,vertical(row,col,a))
            #diagonally right:
            maxi = max(maxi,rd(row,col,a))
            #diagonally left:
            maxi = max(maxi,ld(row,col,a))
    return maxi
a = []
for i in range(20):
    a.append(LI())
print(main(a))
def LI(): return list(map(int, input().split()))


def horizontal(row,col,a):
    if col <= len(a[0])-4:
        return a[row][col] * a[row][col+1] * a[row][col+2] * a[row][col+3]
    else:
        return 0
def vertical(row,col,a):
    if row <= len(a)-4:
        return a[row][col] * a[row+1][col] * a[row+2][col] * a[row+3][col]
    else:
        return 0
def rd(row,col,a):
    if col <= len(a[0])-4 and row <= len(a)-4:
        ans = 1
        ans *= a[row][col]
        ans *= a[row+1][col+1]
        ans *= a[row+2][col+2]
        ans *= a[row+3][col+3]
        return ans
    else:
        return 0
def ld(row,col,a):
    if col >=3 and row <= len(a)-4:
        ans = 1
        ans *= a[row][col]
        ans *= a[row+1][col-1]
        ans *= a[row+2][col-2]
        ans *= a[row+3][col-3]
        return ans
    else:
        return 0

def main(a):
    maxi = 0
    for row in range(len(a)):
        for col in range(len(a[0])):
            maxi = max(maxi,horizontal(row,col,a))
            maxi = max(maxi,vertical(row,col,a))
            #diagonally right:
            maxi = max(maxi,rd(row,col,a))
            #diagonally left:
            maxi = max(maxi,ld(row,col,a))
    return maxi
a = []
for i in range(20):
    a.append(LI())
print(main(a))
一抹微笑 2024-11-21 20:50:58

您两次都检查相同的对角线。在网格中(在纸上)画出您要检查的线条,以便轻松查看。

将其中一个更改为从 X 添加并从 Y 减去(或相反)。

You are checking the same diagonal lines both times. Draw the lines you are checking in the grid (on paper), to see this easily.

Change one of them to add from X and subtract from Y (or the other way around).

独自←快乐 2024-11-21 20:50:58

一些提示:

  • 你不需要这个:

    c[0] = source.charAt(x);
    c[1] = source.charAt(x + 1);
    s = 新字符串(c, 0, 2);
    

    你可以直接写

    s= source.charAt(x) +""+ source.charAt(x+1);

    或者更好地使用

    s = source.substring(x, x+2);

  • 检查更简单数据的对角线

  • 如果确实不需要,请勿交换内部外部

  • 写 gird.length 而不是 20

A few tips :

  • You dont need this :

    c[0] = source.charAt(x);
    c[1] = source.charAt(x + 1);
    s = new String(c, 0, 2);
    

    you can just write

    s= source.charAt(x) +""+ source.charAt(x+1);

    or even better use

    s = source.substring(x, x+2);

  • Check the diagonals on simpler data

  • Don't swap the inner outer for if you really don't need to

  • write gird.length instead 20

独孤求败 2024-11-21 20:50:58

我认为您的代码的问题在于您尝试使用字符串。尝试使用 3d 数组重写它。我的解决方案大约有 14 行代码。

公开课 P11 {

int max, digits;
int[][] grid = {

P11() {
    max = 0;
    digits = 4;
}

public void run() {
    for (int i=0; i<grid.length-digits+1; i++)
        for (int j=0; j<grid.length-digits+1; j++) {
            //iterate through the grid          }
    System.out.println(max);

}

private int getMaxProduct(int xIndex, int yIndex) {
    int p1=1, p2=1, p3=1, p4=1;
    for (int i=0; i<digits; i++) {
        ///find all the products        }
    return //maximum product    }

I think what is wrong with your code is that you are trying to use strings. Try re-writing it using a 3d array. My solution has about 14 lines of code.

public class P11 {

int max, digits;
int[][] grid = {

P11() {
    max = 0;
    digits = 4;
}

public void run() {
    for (int i=0; i<grid.length-digits+1; i++)
        for (int j=0; j<grid.length-digits+1; j++) {
            //iterate through the grid          }
    System.out.println(max);

}

private int getMaxProduct(int xIndex, int yIndex) {
    int p1=1, p2=1, p3=1, p4=1;
    for (int i=0; i<digits; i++) {
        ///find all the products        }
    return //maximum product    }
未央 2024-11-21 20:50:58

我猜你的/对角线计算是错误的..
我已经用java解决了这个问题:

for (i = 0; i < 17; i++) {
    for (j = 3; j < 20; j++) {
      product.add(twoDArray[i][j] * twoDArray[i + 1][j - 1] * twoDArray[i + 2][j - 2] *   twoDArray[i + 3][j - 3]);
        }
    }

Your / diagonal calculation is wrong i guess ..
I have solved it in java :

for (i = 0; i < 17; i++) {
    for (j = 3; j < 20; j++) {
      product.add(twoDArray[i][j] * twoDArray[i + 1][j - 1] * twoDArray[i + 2][j - 2] *   twoDArray[i + 3][j - 3]);
        }
    }
爱要勇敢去追 2024-11-21 20:50:58

您应该使用整数数组,您的实现中有太多类型转换,而且使用数组索引要容易得多。

我使用一维数组编写了一个复杂度为 O(n) 的简单代码(在 javascript 中)。

var input = [08, 02, 22, 97, 38, 15, 00, 40, 00, 75, 04, 05, 07, 78, 52, 12, 50, 77, 91, 08,49, 49, 99, 40, 17, 81, 18, 57, 60, 87, 17, 40, 98, 43, 69, 48, 04, 56, 62, 00,81, 49, 31, 73, 55, 79, 14, 29, 93, 71, 40, 67, 53, 88, 30, 03, 49, 13, 36, 65,52, 70, 95, 23, 04, 60, 11, 42, 69, 24, 68, 56, 01, 32, 56, 71, 37, 02, 36, 91,22, 31, 16, 71, 51, 67, 63, 89, 41, 92, 36, 54, 22, 40, 40, 28, 66, 33, 13, 80,24, 47, 32, 60, 99, 03, 45, 02, 44, 75, 33, 53, 78, 36, 84, 20, 35, 17, 12, 50,32, 98, 81, 28, 64, 23, 67, 10, 26, 38, 40, 67, 59, 54, 70, 66, 18, 38, 64, 70,67, 26, 20, 68, 02, 62, 12, 20, 95, 63, 94, 39, 63, 08, 40, 91, 66, 49, 94, 21,24, 55, 58, 05, 66, 73, 99, 26, 97, 17, 78, 78, 96, 83, 14, 88, 34, 89, 63, 72,21, 36, 23, 09, 75, 00, 76, 44, 20, 45, 35, 14, 00, 61, 33, 97, 34, 31, 33, 95,78, 17, 53, 28, 22, 75, 31, 67, 15, 94, 03, 80, 04, 62, 16, 14, 09, 53, 56, 92,16, 39, 05, 42, 96, 35, 31, 47, 55, 58, 88, 24, 00, 17, 54, 24, 36, 29, 85, 57,86, 56, 00, 48, 35, 71, 89, 07, 05, 44, 44, 37, 44, 60, 21, 58, 51, 54, 17, 58,19, 80, 81, 68, 05, 94, 47, 69, 28, 73, 92, 13, 86, 52, 17, 77, 04, 89, 55, 40,04, 52, 08, 83, 97, 35, 99, 16, 07, 97, 57, 32, 16, 26, 26, 79, 33, 27, 98, 66,88, 36, 68, 87, 57, 62, 20, 72, 03, 46, 33, 67, 46, 55, 12, 32, 63, 93, 53, 69,04, 42, 16, 73, 38, 25, 39, 11, 24, 94, 72, 18, 08, 46, 29, 32, 40, 62, 76, 36,20, 69, 36, 41, 72, 30, 23, 88, 34, 62, 99, 69, 82, 67, 59, 85, 74, 04, 36, 16,20, 73, 35, 29, 78, 31, 90, 01, 74, 31, 49, 71, 48, 86, 81, 16, 23, 57, 05, 54,01, 70, 54, 71, 83, 51, 54, 69, 16, 92, 33, 48, 61, 43, 52, 01, 89, 19, 67, 48];
var start = Date.now();
var max = 0;
var row = 0;
var rowIndex = 0;
for (var i = 0; i < input.length - 3; i++) {
    var tmpProd;
    if(rowIndex < 17) {
        tmpProd = input[i] * input[i+1] * input[i+2] * input[i+3];
        if(tmpProd > max) max = tmpProd;
    }
    if(row < 17) {
        tmpProd = input[i] * input[i+20] * input[i+40] * input[i+60];
        if(tmpProd > max) max = tmpProd;
    }
    if(rowIndex < 17 && row < 17) {
        tmpProd = input[i] * input[i+21] * input[i+42] * input[i+63];
        if(tmpProd > max) max = tmpProd;
    }
    if(rowIndex > 2 && row < 17) {
        tmpProd = input[i] * input[i+19] * input[i+38] * input[i+57];
        if(tmpProd > max) max = tmpProd;
    }
    if(rowIndex < 17 && row > 2) {
        tmpProd = input[i] * input[i-19] * input[i-38] * input[i-57];
        if(tmpProd > max) max = tmpProd;
    }
    if(rowIndex == 19) {
        rowIndex = 0;
        row++;
    } else {
        rowIndex++;
    }
}
console.log('time: ', Date.now() - start);
console.log('max: ', max);

编写代码时,您应该始终牢记其复杂性和执行所需的时间。只需很少的代码优化,您就可以在几秒钟内改进您的解决方案。

干杯。

You should use integer array, there are too many type castings in your implementation, also it's much easier to work with array indexes.

I wrote a simple code(in javascript tho) with O(n) complexity using one dimensional array.

var input = [08, 02, 22, 97, 38, 15, 00, 40, 00, 75, 04, 05, 07, 78, 52, 12, 50, 77, 91, 08,49, 49, 99, 40, 17, 81, 18, 57, 60, 87, 17, 40, 98, 43, 69, 48, 04, 56, 62, 00,81, 49, 31, 73, 55, 79, 14, 29, 93, 71, 40, 67, 53, 88, 30, 03, 49, 13, 36, 65,52, 70, 95, 23, 04, 60, 11, 42, 69, 24, 68, 56, 01, 32, 56, 71, 37, 02, 36, 91,22, 31, 16, 71, 51, 67, 63, 89, 41, 92, 36, 54, 22, 40, 40, 28, 66, 33, 13, 80,24, 47, 32, 60, 99, 03, 45, 02, 44, 75, 33, 53, 78, 36, 84, 20, 35, 17, 12, 50,32, 98, 81, 28, 64, 23, 67, 10, 26, 38, 40, 67, 59, 54, 70, 66, 18, 38, 64, 70,67, 26, 20, 68, 02, 62, 12, 20, 95, 63, 94, 39, 63, 08, 40, 91, 66, 49, 94, 21,24, 55, 58, 05, 66, 73, 99, 26, 97, 17, 78, 78, 96, 83, 14, 88, 34, 89, 63, 72,21, 36, 23, 09, 75, 00, 76, 44, 20, 45, 35, 14, 00, 61, 33, 97, 34, 31, 33, 95,78, 17, 53, 28, 22, 75, 31, 67, 15, 94, 03, 80, 04, 62, 16, 14, 09, 53, 56, 92,16, 39, 05, 42, 96, 35, 31, 47, 55, 58, 88, 24, 00, 17, 54, 24, 36, 29, 85, 57,86, 56, 00, 48, 35, 71, 89, 07, 05, 44, 44, 37, 44, 60, 21, 58, 51, 54, 17, 58,19, 80, 81, 68, 05, 94, 47, 69, 28, 73, 92, 13, 86, 52, 17, 77, 04, 89, 55, 40,04, 52, 08, 83, 97, 35, 99, 16, 07, 97, 57, 32, 16, 26, 26, 79, 33, 27, 98, 66,88, 36, 68, 87, 57, 62, 20, 72, 03, 46, 33, 67, 46, 55, 12, 32, 63, 93, 53, 69,04, 42, 16, 73, 38, 25, 39, 11, 24, 94, 72, 18, 08, 46, 29, 32, 40, 62, 76, 36,20, 69, 36, 41, 72, 30, 23, 88, 34, 62, 99, 69, 82, 67, 59, 85, 74, 04, 36, 16,20, 73, 35, 29, 78, 31, 90, 01, 74, 31, 49, 71, 48, 86, 81, 16, 23, 57, 05, 54,01, 70, 54, 71, 83, 51, 54, 69, 16, 92, 33, 48, 61, 43, 52, 01, 89, 19, 67, 48];
var start = Date.now();
var max = 0;
var row = 0;
var rowIndex = 0;
for (var i = 0; i < input.length - 3; i++) {
    var tmpProd;
    if(rowIndex < 17) {
        tmpProd = input[i] * input[i+1] * input[i+2] * input[i+3];
        if(tmpProd > max) max = tmpProd;
    }
    if(row < 17) {
        tmpProd = input[i] * input[i+20] * input[i+40] * input[i+60];
        if(tmpProd > max) max = tmpProd;
    }
    if(rowIndex < 17 && row < 17) {
        tmpProd = input[i] * input[i+21] * input[i+42] * input[i+63];
        if(tmpProd > max) max = tmpProd;
    }
    if(rowIndex > 2 && row < 17) {
        tmpProd = input[i] * input[i+19] * input[i+38] * input[i+57];
        if(tmpProd > max) max = tmpProd;
    }
    if(rowIndex < 17 && row > 2) {
        tmpProd = input[i] * input[i-19] * input[i-38] * input[i-57];
        if(tmpProd > max) max = tmpProd;
    }
    if(rowIndex == 19) {
        rowIndex = 0;
        row++;
    } else {
        rowIndex++;
    }
}
console.log('time: ', Date.now() - start);
console.log('max: ', max);

When writing your code you should always have in mind it's complexity and time needed for it's execution. With little code optimization you can improve your solution for several seconds.

Cheers.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文