过早客
  • 首页
  • 节点
  • 成员
  • 广告投放
  • 登录
  • 注册

Java编程算法题

IT技术 • witlili • 发表于 7 年前 • 最后回复来自 witlili • 7 年前

麻烦群里大神看一下。


加入收藏 新浪微博 分享到微信 ❤赞 2939 次点击 0 人赞 1 人收藏

打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮

共收到11条回复
stephendanteng 7 年前 #1 赞 1

我先来,解决等边三角形的。
1,对初始数据构造网状链表,每个节点六条链,左上,右上,左,右,左下,右下。
2,对给的三个数,先找出最小的数,等边三角形的最小点到第二大的数的点,必须是沿着左下链找到,如果找不到,就不是,如果找到,记录长度,也就是他们之间的节点数。
3,对第二大的数沿着右链找,找第二部获得的长度,如果刚好是那个数,就是等边三角形,如果不是。不是指定形状。

stephendanteng 7 年前 #2 赞 0

同理,四边形的也能解决:
4个数
1,先找到两个最小的数,先根据公式确认第二小的数是在第一小的数的右边链还是左下链。
2,在根据第三小的数和第一小的数,确定第三小的数是在第一小的数的左下还是右下。
3,判断出方向之后,判断长度,也就是链的节点数,即可。

stephendanteng 7 年前 #3 赞 0

六边形类似的逻辑也行。

stephendanteng 7 年前 #4 赞 0

每层的个数,层数为i,i取值为0到32767.
每层节点个数:node_num = i + 1;

给定一个数n,首先要找到它在哪个层:
sum = 0;
for(i = 0; i < 32767; i++){
sum += (i + 1);
if(n < sum)
{
return i;//i 是层数
}

}

n左上 = n - (i + 1);
n右上 = n - i;
n = n - 1
n右 = n + 1
n左下 = n + i + 1;
n右下 = n + i + 2;

newairisme 7 年前 #5 赞 0

牛B

stephendanteng 7 年前 #6 赞 0

其实找出公式了,不需要建链表,内存和时间应该都足够。

witlili 楼主 7 年前 #7 赞 0

@stephendanteng 谢谢,能够提供可测试程序?

stephendanteng 7 年前 #8 赞 0

@witlili 没时间 写啊,老哥,我是C程序员 ,写了也测不了啊。

tracymcladdy 7 年前 #9 赞 0

业务驱动型程序员表示看到这样的就头疼

stephendanteng 7 年前 #10 赞 2

这个代码写起来还是挺麻烦 的,我写了个三角形的判断的。。。。贴出来参考下。剩下的实在没时间写了,要搞正事了。。

include <stdio.h>

int get_level(int n)
{
int sum = 0;
int i = 0;

for(i = 0; i < 32767; i++)
{
    sum += (i + 1);
    if(n <= sum)
    {
        return i;
    }

}

}

int get_left_on(int n, int i)
{
int res = (n - i - 1);
return (res > 0 ? res:0);
}

int get_right_on(int n, int i)
{
int res = (n - i);
return (res > 0? res:0);
}

int get_left(int n)
{
int res = n - 1;
return (res > 0? res:0);
}

int get_right(int n)
{
return n + 1;
}

int get_left_down(int n, int i)
{
return n + i + 1;
}

int get_right_down(int n, int i)
{
return n + i + 2;
}

int get_min_from_three(int a, int b, int c)
{
int min = a;
if(b < min)
{
min = b;
}
if(c < min)
{
min = c;
}
return min;
}

int get_max_from_three(int a, int b, int c)
{
int max = a;
if(b > max)
{
max = b;
}
if(c > max)
{
max = c;
}
return max;
}

int get_second_min_from_three(int a, int b, int c)
{
if(a > b)

{
if(b > c)
{
return b;
}
else if(a < c)
{
return a;
}
else
{
return c;
}
}
else
{
if(a > c)
{
return a; //b > a > c
}
else if(b < c)
{
return b;//c > b > a
}
else
{
return c; // b > c > a
}

}

}

int judge_three(int a, int b, int c)
{
int min = get_min_from_three(a, b, c);
int max = get_max_from_three(a, b, c);

int second_min = get_second_min_from_three(a,b,c);

int i = 0;  
int j = 0;
int left_down = 0;
int right = 0;
int level = get_level(min);
left_down = get_left_down(min, level);
for(i = 0; i < 32767; i++)
{
    if(second_min < left_down)
    {
        return -1;
    }
    if(second_min == left_down)
    {
        break;//found
    }

    level++;
    left_down = get_left_down(left_down, level);
}

if(i == 32767)
{
    return -1;
}


right = get_right(second_min);

for(j = 0; j < 32767; j++)  
{
    if(max < right)
    {
        return -1;
    }
    if(max == right)
    {
        break;//found
    }

    right = get_right(right);

}

if(i == j)
{
    return 0;//found
}

return -1;

}

int main(int argc, char **argv)
{

printf("hello world !\n");

int res = 0;
res = judge_three(1,4,6);
if(res == 0)
{
    printf("three found!\n");
}
else
{
    printf("not three!\n");
}
res = judge_three(2,4,6);
if(res == 0)
{
    printf("three found!\n");
}
else
{
    printf("not three!\n");
}

return 0;

}

witlili 楼主 7 年前 #11 赞 0

@stephendanteng 谢谢,辛苦了

请绑定手机号后,再发言,点击此处
Guozaoke.com—源自武汉的高端交流分享社区
相关主题
华为麒麟X90用5nm工艺
开发了一个管理 Linux 服务器的桌面可视化管理工具,求蹂躏
服务器可视化采用纯前端渲染,这个技术实现难度如何
最近时间少了, 隔了这么久, 才做了一个网站
做了一款摸鱼软件,有人要试用吗?
有搞嵌入式硬件的吗?
搞了个AI 生图的网站,不需要登录,永久免费
社友们,你们是怎么入编程这行的?
计算机相关5000本电子书PDF分享
求推荐一个AI智能体客服

过早客微信公众号:guozaoke • 过早客新浪微博:@过早客 • 广告投放合作微信:fullygroup50 鄂ICP备2021016276号-2 • 鄂公网安备42018502001446号