有个字符串数组,字符串内只有数字和“.”,比如String[] str={".15", "7..", "402", "..3"},代表有4个字符串,每个元素长度都为 3,现在将数组里面元素进行随机组合成字符串(打乱顺序),
比如将元素按"..3.154027.."的顺序相连。然后截取其中连续的片段"154027"。连续的数字的总和为1+5+4+0+2+7=19。这个19是所有组合里面得到的最大的值。Java怎么实现啊。
比如将元素按"..3.154027.."的顺序相连。然后截取其中连续的片段"154027"。连续的数字的总和为1+5+4+0+2+7=19。这个19是所有组合里面得到的最大的值。Java怎么实现啊。
比如.12 跟.34 取点.34 如果相等,两个都取放入list中
在取32.以点结尾的,求出最大值,放入list中
在取开放性的。求出最大值
接着就是连接字符串了
实现技术:
用正则表达式
匹配第一种"^\\.+\\d+$"
匹配第二种"^\\d+\\.+$"
匹配第三种"^\\d+$"
突然发现还有一种情况
就是这种3.4
这种情况另外找,或者插入到上面去找
匹配规则"[\\d][\\.][\\d]",匹配出来后,分别和上面考虑
代码实现:
楼主看你了
如果有 直接放入list中,不用比较。
public static void main(String[] args) {
String[] strs = { ".15", "7..", "402", "..3" };// 字符串数组,你可以随意组合
String str = ""; // 把上面的数组拼成一个字符串
for (String string : strs) {
str += string;
}
System.out.println(str); // 这里可以把字符串输出来看看 // 上面都是废话!
String[] temp = str.split("\\."); // 去掉所有的.
int max = 0; // 最大值变量
for (String string : temp) {
if (string.length() != 0) {
int sum = sum(string); // 把所有连续的片段传过去计算和
max = sum > max ? sum : max; // 与当前最大值比较
}
}
System.out.println(max);
} static int sum(String num) {
String[] nums = num.split(""); // 把连续的片段分隔成一个个单一的数字
int sum = 0;
for (String string : nums) {
if (string.length() != 0) {
int i = Integer.parseInt(string);
sum += i; //累加后返回和
}
}
return sum;
}
public static void main(String args[]) {
String strs[]={".15", "7..", "402", "..3"};
List<String> list=Arrays.asList(strs);
StringBuilder sb=new StringBuilder();
int max=Integer.MIN_VALUE,index=-1,length=0;
int tempSum=0,tempL=0; //辅助变量
Collections.shuffle(list);
for(String s:strs)
sb.append(s);
System.out.println("打乱顺序后生成的字符串:"+sb);
sb.append('.');
for(int i=0;i<sb.length();i++) {
char ch=sb.charAt(i);
if(ch>0x2f&&ch<0x3a) { //累加相连的数字
tempSum+=ch-0x30;
tempL++;
} else { //对'.'的处理
if(tempSum>max) {
index=i-(length=tempL);
max=tempSum;
}
tempSum=0;
tempL=0;
}
}
System.out.println("和最大的子串:"+sb.substring(index,index+length));
System.out.println("最大的和:"+max);
}
public static void main(String[] args) {
String[] strs = { ".15", "7..", "402", "..3" };// 字符串数组,你可以随意组合
String str = ""; // 把上面的数组拼成一个字符串
for (String string : strs) {
str += string;
}
System.out.println(str); // 这里可以把字符串输出来看看 // 上面都是废话!
String[] temp = str.split("\\."); // 去掉所有的.
int max = 0; // 最大值变量
for (String string : temp) {
if (string.length() != 0) {
int sum = sum(string); // 把所有连续的片段传过去计算和
max = sum > max ? sum : max; // 与当前最大值比较
}
}
System.out.println(max);
} static int sum(String num) {
String[] nums = num.split(""); // 把连续的片段分隔成一个个单一的数字
int sum = 0;
for (String string : nums) {
if (string.length() != 0) {
int i = Integer.parseInt(string);
sum += i; //累加后返回和
}
}
return sum;
}
“\\.”是什么意思啊,怎么用双斜杠?
split方法接受的是一个正则表达式,正则表达式的特殊符号都要转义,如 \ | . ( ) [ ] ^ $ - 等。
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static String[] random(String[] strs){
int index = 0;
for(int i = 0;i<strs.length;i++){
index =Math.abs(new Random().nextInt()%strs.length);
String temp = strs[i];
strs[i] = strs[index];
strs[index] = temp;
}
return strs;
}
public static void main(String[] args) {
String[] str={".15", "7..", "402", "..3"};
Test.random(str);
StringBuffer sb = new StringBuffer();
for(String s:str){
sb.append(s);
}
String temp = sb.toString();
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher(temp);
int sum = 0;
int Maxsum = 0;
String maxSumStr ="";
System.out.println(sb);
while(m.find()){
String s = m.group();
for(int i=0;i<s.length();i++){
sum+=Integer.parseInt(String.valueOf(s.charAt(i)));
}
if(sum>Maxsum){
Maxsum = sum;
maxSumStr = s;
sum = 0;
}
}
System.out.println("最大值:"+Maxsum);
System.out.println("最大子串"+maxSumStr);
}
}
这句话什么意思?
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static String[] random(String[] strs){
int index = 0;
for(int i = 0;i<strs.length;i++){
index =Math.abs(new Random().nextInt()%strs.length);
String temp = strs[i];
strs[i] = strs[index];
strs[index] = temp;
}
return strs;
}
public static void main(String[] args) {
String[] str={".15", "7..", "402", "..3",".6.","9.8"};
Test.random(str);
StringBuffer sb = new StringBuffer();
for(String s:str){
sb.append(s);
}
String temp = sb.toString();
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher(temp);
int sum = 0;
int Maxsum = 0;
String maxSumStr ="";
System.out.println(sb);
while(m.find()){
String s = m.group(0);
for(int i=0;i<s.length();i++){
sum+=Integer.parseInt(String.valueOf((s.charAt(i))));
}
if(sum > Maxsum){
Maxsum = sum;
maxSumStr = s;
sum = 0;
}
else{
sum=0;//刚才漏掉这句。
}
}
System.out.println("最大值:"+Maxsum);
System.out.println("最大子串"+maxSumStr);
}
}
那是因为C#的split根本不是用正则表达式做的。C#里的函数基本上是继承STL的,处理字符串一般都是做字符串扫描。
要去重复?我这个不重复啊。不知道要表达什么,那里重复了。
import java.util.Arrays;
import java.util.Collections;
import java.util.List;public class Test3 { String[] strArray = { ".15", "7..", "402", "..3" }; public String RandomCombination() {
String str = "";
List<String> list = Arrays.asList(strArray);
Collections.shuffle(list);
for (String s : list) {
str += s;
}
System.out.println("str = " + str);
System.out.println("=============================");
return str;
} public void printResult() {
String str = RandomCombination();
String[] strArray = str.split("\\.");
int maxValue = 0;
for (String s : strArray) {
if (s != null && s.length() > 1) {
System.out.print("str = " + s);
int num = compute(s);
if (num > maxValue) {
maxValue = num;
}
System.out.println(" value = " + num);
}
}
System.out.println("========= MAX VALUE IS ===========");
System.out.println(" maxValue = " + maxValue);
} public int compute(String str) {
int num = 0;
for (int i = 0, j = str.length(); i < j; i++) {
num += Integer.parseInt(String.valueOf(str.charAt(i)));
}
return num;
} public static void main(String[] args) {
Test3 test = new Test3();
test.printResult();
}
}
Collections.shuffle(list);
这样就可以打乱了,各位英雄。
真不知道你要很多maxValue做什么,我觉得26楼写得已经够好了,唯一需要修改的地方就是在printResult方法的for循环里,s.length() >= 1 。
str = 402.15..37..
=============================
str = 402 value = 6
str = 15 value = 6
str = 37 value = 10
========= MAX VALUE IS ===========
maxValue = 10这样还没有满足你的需求吗?
CSDN回帖机制还有待加强啊!
String[] str = { ".15", "7..", "402", "..3", "302", "32044...", "...234" };
int maxLeft = 0, posLeft = -1, maxRight = 0, posRight = -1, middle = 0; // 记录中间计算信息
StringBuffer sb = new StringBuffer(); // 记录找到的顺序
// 一次循环遍历即可结束任务
for (int i = 0; i < str.length; i++) {
String s = str[i];
int tmp = sum(s);
if (isNumber(s.charAt(0))) {
// 左边第一个是数字
if (isNumber(s.charAt(s.length() - 1))) {
// 说明整个都是数字,可以直接拼接入middle
sb.append(s);
middle += tmp;
} else {
// 可以作为right进行拼接
if (tmp > maxRight) {
maxRight = tmp;
posRight = i;
}
}
} else if (isNumber(s.charAt(s.length() - 1))) {
// 右边第一个是数字,可以作为left进行拼接
if (tmp > maxLeft) {
maxLeft = tmp;
posLeft = i;
}
}
}
if (posLeft >= 0) sb.insert(0, str[posLeft]); // 拼左边
if (posRight >= 0) sb.append(str[posRight]); // 拼右边
System.out.println("Line: " + sb + "\t\tSum: " + (maxLeft + middle + maxRight));
} public static boolean isNumber(char c) {
return c >= '0' && c <= '9';
} public static int sum(String s) {
int sum = 0;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c >= '0' && c <= '9')
sum += (c - '0');
}
return sum;
}
}