算法题,分享给需要的人

1. 等差数列含有一序列的数项,所有后一项减去前一项的差值都想吐。例如,对于序列3,7,11,15;每一项减去前一项得到4。给定你一系列整数,我们要找到通过从给定系列整数       中选择部分数字出来组成等差数列(可以交换数字顺序,可以选取所有数字),并从中找到最长的等差数列。
    输入:
            输入一个整形数组int[] values,表示整个序列的所有值。values 含有2到50个元素(其中包括2和50)
    输出:
           返回最长的等差数列的长度
    举例:

           values:{3,8,4,5,6,2,2},从这些数字中选取一些数字所组成的最长等差数列是2,3,4,5,6,所以返回5

    答案:

public static int longest(int[] values){
        if (values==null){
            return 0;
        }
        Arrays.sort(values);
        int maxlen=values[values.length-1]-values[0];
        int ans=1;
        if (maxlen==0){
            return values.length;
        }
       int[][] dp=new int[values.length][maxlen+1];
        for (int i = 0; i <dp.length ; i++) {
            for (int j = 0; j < maxlen+1; j++) {
                dp[i][j]=1;
            }
        }
        for (int i = 1; i <values.length ; i++) {
            for (int j = i-1; j >=0; j--) {
                int diff=values[i]-values[j];//算出i和j之间的等差
                dp[i][diff]=dp[j][diff]+1;//当前
                ans=Math.max(ans,dp[i][diff]);
            }
        }
        return ans;
    }

2.如果一个正整数不能被大于1的完全平方数所整除,那么我们就将该数称为无平方数因子的数。例如,靠前的一些无平方数因数的数是{1,2,3,5,6,7,10,11,13,14,15,17,19…}。    给出一个整数n,返回第n个无平方数因子的数。
   输入:
          输入一个整数n. n 的取值范围为1到1,000,000(其中包括1和1,000,000)
   输出:
         返回第n个无平方数因数的数
   举例:
         n = 13, 返回19.

   答案:

public static int getNumber(int n) {
long result = -1;
int count = 0;
for (long i = 1; i <= Long.MAX_VALUE; i++) {
boolean found = false;
for (long j = 2; j <= i; j++) {
if (j * j > i) {
break;
}
if (i % j == 0 && i % (j * j) == 0) {
found = true;
break;
}
}
if (!found) {
count++;
if (count == n) {
result = i;
break;
}
}
}
return (int) result;
}

3.大雄把自己置身于一个无限大的二维平面中,然后假设,自己每次只能移动一步且不能向后移动,同时走过的格子立即塌陷,无法再走第二次。大雄想知道,如果走n步,有      多少个可能到达的终点。
   输入:
         一个正整数n(0<n<=20),表示要走n步。
   输出:
        走n步能到达的终点的数量。
   举例:
        输入1,输出3。

   答案:

public static void numOfPath(int n) {
int[] a = new int[21];
int i;
a[0] = 1;
a[1] = 3;
for (i = 2; i <= 20; i++) {
a[i] = 2 * a[i - 1] + a[i - 2];


}
System.out.println(a[n]);
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值