• 旋转队列


    21  22  ....

    20   7   8   9   10

    19   6   1   2   11

    18   5   4   3   12

    17  16 15  14  13

    如上一个旋转队列,1的坐标为(0,0),x往右为正,y往下为正,比如2(1,0),3(1,1),7(-1,-1).

    写一个函数,输入坐标返回对应的值.

     我是这样干的:

    int foo(int des_x, int des_y)
    {
        
    int x=0,y=0,i,j,cal=1;
        
    if(des_x==0&&des_y==0){
            
    return(1);    
        }
        
    for(i=1;1==1;i++){
            
    for(j=1;j<=i;j++){
                
    if(i&1)x++;
                
    else x--;            
                cal
    ++;
                
    if(x==des_x&&y==des_y){
                    
    return(cal);
                }
            }        
            
    for(j=1;j<=i;j++){
                
    if(i&1)y++;
                
    else y--;
                cal
    ++;
                
    if(x==des_x&&y==des_y){
                    
    return(cal);
                }            
            }        
            
        }

    }

    别人是这样干的

    #define max(a,b) (((a)<(b))?(b):(a))
    #define abs(a) ((a)>0)?(a):(-(a))
    int foo(int x, int y){
        
    int t = max(abs(x), abs(y));
        
    int u = t+t;
        
    int v = u -1;
        v 
    = v * v +u;
        
    if(x == -t)
            v 
    += u + t -y;
        
    else if(y == -t)
            v
    +=3*u+x-t;
        
    else if(y == t)
            v
    +=t-x;
        
    else
            v
    +=y-t;
        
    return v;

    }

    虽然都完成了功能,但是明显别人的代码要聪明一些,这种聪明是要积累的。我自己的代码在坐标比较大的时候运算肯定很慢的,

    别人的就不会。我暂时还没想通他是怎样一个思路把这个算法想出来的。



  • 相关阅读:
    LeetCode刷题7——数字的补数
    Leetcode刷题6—不同路径
    Leetcode刷题5—最大子序和
    LeetCode刷题4——子集
    LeetCode刷题3——位1的个数
    LeetCode刷题2——颠倒二进制位
    小鸡啄米问题求解
    weavenet
    为系统守护进程预留计算资源
    PolicyRouting (ip rule)
  • 原文地址:https://www.cnblogs.com/climberluoxi/p/1357820.html
Copyright © 2020-2023  润新知