今天面试遇到一道逻辑题 不会 求助

shunzi940904 2018-01-03 10:51:35
打印
1
3 4
5 8 12
7 12 20 32
9 16 28 48 80
.....


输入任意一个奇数,输出那一行的数据
...全文
5876 57 打赏 收藏 转发到动态 举报
写回复
用AI写文章
57 条回复
切换为时间正序
请发表友善的回复…
发表回复
大寒Num1 2019-01-17
  • 打赏
  • 举报
回复
Java并发那些事(基础篇) https://www.jianshu.com/p/470f96bde10e
qq_39936465 2019-01-17
  • 打赏
  • 举报
回复
数学公式推导,某行数列Z: Z1= Math.pow(2, 0)*(2x-1),Z2= Math.pow(2, 1)*(2x-2),。。。。。Zn=Math.pow(2, n-1)*(2x-n)。。。 其中x为行数,n为列数。
vipcxj 2018-04-24
  • 打赏
  • 举报
回复
a(n,0) = 2n+1 a(n,m) = a(n-1,m-1) + a(n,m-1) 其中n,m>=0 分别代表行数和列数,从0开始算 根据这个公式用递归很容易就能搞定了~
lan93276 2018-04-22
  • 打赏
  • 举报
回复

我用了一个很初级的做法,看看!
qq_41206744 2018-04-19
  • 打赏
  • 举报
回复
/*其实,没那么复杂,你仔细注意一下规律就知道, 每个数本身加上它正上方的那个数,就会等于这个数的右边的那个数,以此类推,就能得出每行的数了, 问题是,我们怎么通过一个数,得到它正上方的数呢?很简单,从左至右,每一列的上下两个邻近数的差值为2的n-1次方,n 为列数, */ public class simple { public static void main(String []args) { Scanner s=new Scanner (System.in); boolean b1=true; int odd =s.nextInt(); int above=0; int right=0; int center=0; int i=1; int b=1; for(center=odd;i<=odd/2;i++) { if(b1) { System.out.print(odd+" "); b1=false; } above=center-b*2; right=center+above; center=right; b=b*2; System.out.print(right+" "); } } }
Coli薇 2018-04-17
  • 打赏
  • 举报
回复
public static List<Integer> getdata(int num) { int a[][]=new int[num/2+1][]; List<Integer> l=new ArrayList<Integer>(); for(int i=0;i<=num/2;i++) { a[i]=new int[i+1]; for(int j=0;j<=i;j++) { if(j==0) { a[i][j]=2*i+1; } else if(i>0) { a[i][j]=a[i-1][j-1]+a[i][j-1]; } System.out.print(String.valueOf(a[i][j])+" "); if(i==num/2) { l.add(a[i][j]); } } System.out.println(); } return l; } public static void main(String[] args) { List<Integer> l=getdata(7); Iterator<Integer> it=l.iterator(); while(it.hasNext()) { System.out.print(it.next()+" "); } // TODO Auto-generated method stub }
阿闰 2018-04-12
  • 打赏
  • 举报
回复
List<Integer> list = new ArrayList<>();
		for (int i = 0; i < 10; i++) {
			
			if (i % 2 != 0) {
				System.out.print(i + "\t");
				int z = i;
				
				for (int b = 0; b < list.size(); b++) {
					z = list.get(b) + z;
					System.out.print(z + "\t");
					list.set(b, z-list.get(b));//关键点  改值是 你输出的值减去上一个坐标的值
				}

				System.out.println();
				list.add(z);//每次添加的值为最后一次输出的值  

			}
		}
楼主看我的 简单易懂
xw885201 2018-04-11
  • 打赏
  • 举报
回复
瞅瞅!规律还是很明显的
jason_yfbao 2018-04-11
  • 打赏
  • 举报
回复
只要找到每行各列间的关系就好解决,可以没想列之间的递推关系,若每行表示为(f(0),f(1),f(2),.....,f(n)),首先n = 输入奇数除以2去整的数,假设输入的奇数为k, 那么,f(0)=k , f(1)= 2* f(0)-2^1,..... f(n)=2*f(n-1)-2^n, 其中 2^n表示2的n次方 代码就我不写了, 递推公式出来后面代码就很好写的了
萧尽悠然 2018-04-11
  • 打赏
  • 举报
回复
这是一道面试题,重点一定是在考某个点,看到题第一反应应该是递归
萧尽悠然 2018-04-11
  • 打赏
  • 举报
回复
递归思想最简单

public class Dome {
    public static void getOneRow(int start) {
        for (int i = 1; (i - 1) * 2 < start; i++) {
            System.out.print(getOne(start, i) + ",");
        }
    }

    public static int getOne(int start, int n) {
        if (n == 1) {
            return start;
        } else {
            return getOne(start, n - 1) + getOne(start - 2, n - 1);
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入首项:");
        int start = sc.nextInt();
        getOneRow(start);
    }
}
thifern 2018-04-11
  • 打赏
  • 举报
回复
还没有学数组,看你们都用数组,但是我这个好像也可以实现
import java.util.Scanner;

public class CSDN {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int i = input.nextInt();
		for (int x = 1; x <= (i + 1) * 0.5; x++) {
			int s = (int) Math.pow(2, (x - 1)) * (i - x + 1);
			System.out.print(s + "\t");
		}
	}

}
岂是蓬蒿人 2018-04-10
  • 打赏
  • 举报
回复
    int num=5;
        int[] old=new int[num];
        int[] ns=new int[num];
        for(int i=1;i<num+1;i++){
            ns[0]=2*i-1;
            System.out.print(ns[0]+"  ");
            for(int j=1;j<i;j++){
                int re=old[j-1]+ns[j-1];
                ns[j]=re;
                System.out.print(re+"  ");
            }
            System.out.println();
            old=ns;
            ns=new int[num];
        }
        System.out.println("====================");
        for(int i:old){
            System.out.print(i+"  ");
        }
    }
Ai_SH 2018-04-09
  • 打赏
  • 举报
回复
import java.util.Scanner; public class Shu2 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入一个奇数: "); int a = sc.nextInt(); if(a%2 == 1) { int leng = (a+1) / 2; int[] shu = new int[leng]; shu[0] = a; for(int i=1; i<leng; i++) { shu[i] = (int)(Math.pow(2,i)*a - i*Math.pow(2,i)); } for(int i=0; i<leng; i++) { System.out.print(shu[i] + " "); } System.out.println(); } else { System.out.println("输入错误"); } } }
call me baby 2018-04-04
  • 打赏
  • 举报
回复
/** 思路1:纯数学思路 * 1 (0) (4) (-16) (-48) * 3 4 * 5 8 12 * 7 12 20 32 * 9 16 28 48 80 * .......... **/ //分析:第n行:有i个数(第列都是个等差数列a(n)=ai+(n-i)d) //第1个数为:1+(n-1)*2 = 2*n-1---(最后的数为1*1)--------- //第2个数为:4+(n-2)*4 = 4*n-4---(最后的数为2*2) //第3个数为12+(n-3)*8 = 8*n-12---(最后的数为4*3) //第4个数为:32+(n-4)*16 =16*n-32 ---(最后的数为8*4) //第5个数为:80+(n-5)*32=32*n-80---(最后的数为16*5) //...第n行的第i个数通项公式为:a(n) = (2^i)*n-(2^(i-1))*i,共展示n个数 @Test public void test(){ //Math.pow(a,b)指的是a的b次方 int n=5,val; for(int i=1; i<=n; i++){ val = ((int) Math.pow(2, i))*n-(int) Math.pow(2, i-1)*i; System.out.print(val+" "); } }
qq_41953289 2018-04-04
  • 打赏
  • 举报
回复
可以这样看:每个数都=前个数+前个数的上面一个数 或者 第一列往下都是加2的1次方 第2列往下都是加2的2次方 第三列第四列 以此类推。 望采纳
Morpheus丶 2018-03-17
  • 打赏
  • 举报
回复
我认为,不必使用递规,也就是不要分析本层数据跟上层的关系。 正确的分析,应该是 输入的数字行号列号之间的关系。 分析如下:


import java.util.Scanner;


/**
 题目:
  打印
 1
 3   4
 5   8    12
 7   12   20   32
 9   16   28   48   80
 .....

 输入任意一个奇数,输出那一行的数据


 思路分析:提取因式
  2^0  ^1  ^2   ^3   ^4   ^5
 ___________________
 | *1  *2  *4   *8   *16  *32
 |___________________
1|  1
2|  3   2
3|  5   4   3
4|  7   6   5    4
5|  9   8   7    6    5
6|  11  10  9    8    7    6
    n  n-1  n-2  n-3
n/2+1

 */
public class Main {

    public static void main(String[] args) {
        while (true) {
            System.out.println("\n请输入一个整数:");
            Scanner scanner = new Scanner(System.in);
            int number = scanner.nextInt();
            int line = number / 2 + 1;
            for (int i = 0; i < line; i++) {
                System.out.print((int) ((number - i) * Math.pow(2, i)) + "\t");
            }
        }

    }
}
结果:


请输入一个整数:
3
3	4	
请输入一个整数:
5
5	8	12	
请输入一个整数:
7
7	12	20	32	
请输入一个整数:
9
9	16	28	48	80	
Jisfeng 2018-03-17
  • 打赏
  • 举报
回复
public class Demo1 {
	/**
	 *
	 给定一个正整数n,打印第n行,每行的规律如下:
	 1
	 3	4
	 5	8	 12
	 7	12   20   32
	 9	16   28   48   80
	 两条规律:
	 1.第i个数字 = 第i-1个数字 + 上一行第i-1个数字
	 2.第i个数字 - 上一行第i个数字 = 2 * (第i-1个数字 - 上一行第i-1个数字)
	 */
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		int cur = 2 * n - 1, pre = cur - 2, diff = 2;
		System.out.print(cur + "\t");
		for (int i = 1; i < n; i++) {
			cur += pre;
			pre = cur - 2 * diff;
			// 缓存第i个数与上一行第i个数的差,这样可以避免使用pow()
			diff = cur - pre;
			System.out.print(cur + "\t");
		}
	}
}
qq_21912611 2018-03-15
  • 打赏
  • 举报
回复
	/**
	 * 根据当前数组,计算下一个数组
	 * @param arr
	 * @return
	 */
	public static int[] nextArr(int... arr) {
		int[] res = new int[arr.length + 1];
		for(int i = 0, len = res.length; i < len; ++i){
			if(i == 0) {
				res[i] = arr[i] + 2;
			} else {
				res[i] = res[i - 1] + arr[i - 1];
			}
		}
		return res;
	}
	
	/**
	 * 格式化输出
	 * @param arr
	 */
	public static void formatPrintln(int[] arr){
		Arrays.stream(arr).forEach(d -> System.out.print(d + " "));
		System.out.println();
	}
	
	@Test
	public void test02(){
		int[] arr = {1}; //原始数组
		for(int i = 0; i < 6; i++){
			formatPrintln(arr); //打印当前
			arr = nextArr(arr); //获取下一行
		}
	}
NewMoons 2018-03-14
  • 打赏
  • 举报
回复
精华就在32楼的总结,1楼就是正确答案,其余什么递归、和上行相加规律之类的都是浮云。 条条大道通罗马,要找到性价比最高或者说最小代价实现目的的那条才是王道。
加载更多回复(37)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧