本文目录一览:
- java算法题
- Java算法题:判断并输出101-200中所有素数,代码中单等号与双等号的区别?
- [java 一道算法题,阿里面试的题,我同学给我的,希望有人解答下?](#java 一道算法题,阿里面试的题,我同学给我的,希望有人解答下?)
- 一道java算法题提供了正确代码,不知道是不是我理解错误运行结果并不是最大值?
- [java 算法题:将下面的字符串按规则拆开,保存进list集合中](#java 算法题:将下面的字符串按规则拆开,保存进list集合中)
- 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
:用于记录历史最大累加和。 上面算法的start
和end
其实没用,本意是找出具体子数组,但上面算法部分情况下是无法实现的。
@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));
}
}
}
}