java算法题,java算法题达到什么水平

发布时间:2022-11-29

本文目录一览:

  1. java算法题
  2. Java算法题:判断并输出101-200中所有素数,代码中单等号与双等号的区别?
  3. [java 一道算法题,阿里面试的题,我同学给我的,希望有人解答下?](#java 一道算法题,阿里面试的题,我同学给我的,希望有人解答下?)
  4. 一道java算法题提供了正确代码,不知道是不是我理解错误运行结果并不是最大值?
  5. [java 算法题:将下面的字符串按规则拆开,保存进list集合中](#java 算法题:将下面的字符串按规则拆开,保存进list集合中)
  6. Java简单算法问题

java算法题

public class Monkey {
    public static void main(String[] args) {
        int sum = 0, remain = 1;
        // 每天吃剩的桃子加一个正好是前一天桃子的一半,每天桃子的总数就是前一天剩下桃子的数量
        for (int day = 9; day >= 1; day--) {
            sum = (remain + 1) * 2;
            remain = sum;
            System.out.println("第" + day + "天还剩" + remain + "个桃子");
        }
        System.out.println(sum);
    }
}

Java算法题:判断并输出101-200中所有素数,代码中单等号与双等号的区别?

这是很基础的问题。

  • = 是赋值运算,把后面的值赋值给前面的参数。
  • == 是关系运算,比较前后两个参数是否相同。 注意如果 ??? 处用单等号,就是赋值运算,将 true 赋值给 flag,所以 if 中会一直是 true,也会一直执行 if 中的代码。 双 == 就是比较了,结果是真才会执行 if 中的代码。

java 一道算法题,阿里面试的题,我同学给我的,希望有人解答下?

HashMap<String, Object> ihp = new LinkedHashMap<String, Object>();
static class MyMap {
    List[] lists;
    public MyMap(List... lists) {
        this.lists = lists;
    }
    public String toString() {
        if (lists == null || lists.length == 0) {
            return "{}";
        }
        StringBuilder sb = new StringBuilder();
        sb.append('{');
        int i = 0;
        for (List list : lists) {
            sb.append(list);
            i++;
            if (i == lists.length)
                return sb.append('}').toString();
            sb.append(",");
        }
        return "{}";
    }
}
ihp.put("on1", new MyMap(list2, list1));
ihp.put("on2", new MyMap(list4, list3));
ihp.put("on3", new MyMap(list5));
ihp.put("on4", new MyMap(list6));
System.out.println(ihp.toString());

估计有更好的办法,最开始想到的是 List[],发现打印出来是 [[xxx,xxx,xxx],[xx,x,x]] 这种结构。

一道java算法题提供了正确代码,不知道是不是我理解错误运行结果并不是最大值?

首先理解下题意,关键是连续的子数组,比如 {1, 2, -1},连续的子数组包括 {1}{2}{-1}{1, 2}{2, -1}{1, 2, -1}。 其次是求各子数组和的最大值,上面的算法求最大值分两部分,循环遍历所有值。

  • curSum:用于某一个子数组的累加和。
  • curMaxSum:用于记录历史最大累加和。 上面算法的 startend 其实没用,本意是找出具体子数组,但上面算法部分情况下是无法实现的。
@Test
public void test() {
    // int[] num = {1,-2,3,10,-4,7,2,-5};
    // int[] num = {1,-2,3,10,-4,10,2,-5};
    int[] num = {-1,-2,3,4,-5,-6,-7};
    System.out.println(maxSum(num));
}
public int maxSum(int[] num) {
    int curSum = 0;
    int curMaxSum = -99999999;
    int finalStart = 0;
    int finalEnd = 0;
    int start = 0;
    for (int i = 0; i < num.length; i++) {
        if (curSum <= 0) {
            curSum = num[i];
            start = i;
        } else {
            curSum += num[i];
        }
        if (curSum > curMaxSum) {
            finalStart = start;
            finalEnd = i;
            curMaxSum = curSum;
        }
    }
    for (int i = finalStart; i <= finalEnd; i++) {
        System.out.println(num[i]);
    }
    return curMaxSum;
}

java 算法题:将下面的字符串按规则拆开,保存进list集合中

String 类的 split 函数先按中文逗号切分,再按 # 切分,就可以把此字符串前面的字母保存在集合 a 中,将后面的文字保存在集合 b 中。具体的 Java 程序如下:

import java.util.ArrayList;
import java.util.List;
public class CC {
    public static void main(String[] args) {
        String s = "yw#语文,ss#数学,yy#英语,ty#体育";
        List<String> a = new ArrayList<String>();
        List<String> b = new ArrayList<String>();
        String[] s1 = s.split(",");
        for (String tmp : s1) {
            String[] s2 = tmp.split("#");
            a.add(s2[0]);
            b.add(s2[1]);
        }
        for (int i = 0; i < a.size(); i++)
            System.out.print(a.get(i) + " ");
        System.out.println();
        for (int i = 0; i < b.size(); i++)
            System.out.print(b.get(i) + " ");
        System.out.println();
    }
}

运行结果:

yw ss yy ty
语文 数学 英语 体育

Java简单算法问题

初步做了一个出来,但是效率并不是很高,前100个计算速度还可以,但是往后就很慢了。如果什么时候有空的话可以再看看,先给你代码吧,不知道能不能帮上你。

public class AlisandaNumber {
    private static final int MAX_INDEX = 1000; // 可以先把这个常量改为1-6,验证正确性
    public static void main(String[] args) {
        int a = 0;
        int index = 0;
        while (index < MAX_INDEX) {
            a += 6; // 每次循环自增6,由题目规律可知A是6的倍数
            boolean breakOut = false;
            // 最大约数为此数的平方根,因为如果是两个平方根相乘的话,剩下的就只有1了
            int maxNum = (int) Math.ceil(Math.sqrt(a));
            p:
            for (int p = 1; p <= maxNum; p++) {
                if (a % p != 0) {
                    continue; // 如果不是约数的话,没必要考虑,下同
                }
                // 最大约数为平方根的相反数,原理同上
                maxNum = (int) Math.ceil(Math.sqrt(a / p));
                for (int q = -1; q >= -maxNum; q--) { // q和r必为负数
                    if (a % q != 0) {
                        continue;
                    }
                    int r = a / (p * q);
                    int nonZero = p * q + p * r + q * r;
                    if (nonZero == 0) {
                        continue;
                    }
                    if ((a == p * q * r) || (a == (p * q * r) / nonZero)) {
                        index++;
                        breakOut = true;
                        break p; // 跳出外层循环
                    }
                }
            }
            if (breakOut) {
                System.out.println(String.format("第%d个压力山大数是%d", index, a));
            }
        }
    }
}