java 落单,Codewars征战记录-JAVA篇

无意中发现一个代码题目的网站,做了一个题,深有感触。记下来大牛们的解决思路

渣渣程序员就是我了,我会先列自己的写法,再列大牛的写法,共勉。

题目:传入一个数字n,求3和5的倍数和。如果该数为3和5共同的倍数,则计算一次。

DEMO:传入数字10,求3和5的倍数和,所以需要计算3、5、6、9的和,即23

public int solution(intnumber) {int result = 0;for (int i = number - 1; i > 0; i--) {if (i%5 == 0 || i%3 == 0){

result= i +result;

}

}returnresult;

}

大神例子1,使用 intsteam

public int solution(intnumber) {return IntStream.range(3, number).filter(n -> n % 3 == 0 || n % 5 == 0).sum();

}

还有个不使用循环。。

/*The sum of multiples of 3 is 3 + 6 + 9 + ... = 3 (1+2+3+...)

The sum of mulitples of 5 is 5 + 10 + 15 + ... = 5 (1+2+3+...)

If we just sum these, we'll get double values when a number is divisble by both,

so we substract the sum of multiples of 15, which is obtained in a similar manner.

The upper bound cannot be floor function because the inputed number shouldn't count.*/

importjava.lang.Math;public classSolution {public int solution(intn) {int a = (int) Math.ceil(n/3d) - 1;int b = (int) Math.ceil(n/5d) - 1;int c = (int) Math.ceil(n/15d) - 1;return (3 * a * (a+1) + 5 * b * (b+1) - 15 * c * (c + 1)) / 2;

}

}

题目:ATM的密码只能有4或者6位的数字密码组成。写一个方法判断。

首推正则

public static booleanvalidatePin(String pin) {

// 自己正则写的不熟悉,用的是:[0-9]{4,4}|[0-9]{6,6}return pin.matches("\\d{4}|\\d{6}");

}

JDK8写法

public static booleanvalidatePin(String pin) {if(pin == null) return false;if (pin.length() == 4 || pin.length() == 6)returnpin.chars().allMatch(Character::isDigit);return false;

}

题目:将输入的字符串按照规定格式打印,输入的字符串范围A-Za-z

例如:ZpglnRxqenU,则输出 Z-Pp-Ggg-Llll-Nnnnn-Rrrrrr-Xxxxxxx-Qqqqqqqq-Eeeeeeeee-Nnnnnnnnnn-Uuuuuuuuuuu

用流应该是很快捷的,不过不熟悉,只能用笨方法了

public staticString accum(String s) {//your code

char[] chars =s.toUpperCase().toCharArray();

StringBuilder sb= newStringBuilder();

String tempStr= null;for(int i=0;i

sb.append(chars[i]);

tempStr=String.valueOf(chars[i]).toLowerCase();for(int j=0;j

sb.append(tempStr);

}

sb.append("-");

}

sb.delete(sb.length()-1,sb.length());returnsb.toString();

}

流写法

public staticString accum(String s) {return IntStream.range(0, s.length())

.mapToObj(i-> IntStream.range(0, i + 1)

.mapToObj(i1-> i1 == 0 ?String.valueOf(s.charAt(i)).toUpperCase() : String.valueOf(s.charAt(i)).toLowerCase())

.collect(Collectors.joining())

).collect(Collectors.joining("-"));

}

题目:简单来说就是一段话的首字母大写

源:How can mirrors be real if our eyes aren't real

转为:How Can Mirrors Be Real If Our Eyes Aren't Real

自己的是split然后拼接,就不上了,太丑陋=.=

importjava.lang.Character;public classJadenCase {publicString toJadenCase(String phrase) {if(phrase == null || phrase.equals("")) return null;char[] array =phrase.toCharArray();for(int x = 0; x < array.length; x++) {if(x == 0 || array[x-1] == ' ') {

array[x]=Character.toUpperCase(array[x]);

}

}return newString(array);

}

}

流写法

publicString toJadenCase(String phrase) {if (null == phrase || phrase.length() == 0) {return null;

}return Arrays.stream(phrase.split(" "))

.map(i-> i.substring(0, 1).toUpperCase() + i.substring(1, i.length()))

.collect(Collectors.joining(" "));

}

题目:找出奇怪的数字,即落单的数字

例如:20,1,-1,2,-2,3,3,5,5,1,2,4,20,4,-1,-2,5

找到5

我的思路是用Set,如果存在就将存在的移除,否则放入Set。然而,还是有简易写法。。

public static int findIt(int[] A) {int odd = 0;for (inti : A) {

odd^=i;

}returnodd;

}

一如既往也能用stream

public static int findIt(int[] arr) {return stream(arr).reduce(0, (x, y) -> x ^y);

}

题目:统计出现重复的字符的次数

例如:indivisibility   i出现了多次,所以返回1,因为只有一个i重复出现了。

我是先统一大写后,用了两个Set作过滤

public static intduplicateCount(String text) {

Set firstSet = new HashSet<>();

Set targetSet = new HashSet<>();for(Character c : text.toUpperCase().toCharArray()) {if(firstSet.contains(c)) {

targetSet.add(c);

}else{

firstSet.add(c);

}

}returntargetSet.size();

}

一行的流写法。。。

public static intduplicateCount(String text) {return (int)text.toLowerCase().chars().boxed().collect(Collectors.groupingBy(k->k,Collectors.counting())).values().stream().filter(e->e>1).count();

}

题目:给定几个单词,由中划线或者下划线连接,转为驼峰写法

toCamelCase("the-stealth-warrior"); // returns "theStealthWarrior"

toCamelCase("The_Stealth_Warrior"); // returns "TheStealthWarrior"

我是用apache的大小写转换,不过因为导包有点问题。

采用原始的split后,用StringBuilder拼接首字母大写的字符。

流的写法:

staticString toCamelCase(String s){

String[] words= s.split("[-_]+");returnArrays.stream(words)

.skip(1)

.map(w-> w.substring(0, 1).toUpperCase().concat(w.substring(1)))

.reduce(words[0], String::concat);

}

题目:验证信用卡题目

给一串正整数,如果个数为偶数则从第一个开始每隔1位作双倍处理

如果个数为奇数则从第二个开始每隔1位作双倍处理

如果双倍后大于9,则减去9.

1714 ==> [1*, 7, 1*, 4] ==> [2, 7, 2, 4]

12345 ==> [1, 2*, 3, 4*, 5] ==> [1, 4, 3, 8, 5]

891 ==> [8, 9*, 1] ==> [8, 18, 1]

最后将数字加在一起,如果能被10整除,则为正确。否则错误

思路:转成Integer集合,算出哪些需要双倍并处理的,最后sum一下。

public static booleanvalidate(String n){

List source = Arrays.stream(n.split("")).map(Integer::valueOf).collect(Collectors.toList());int index = source.size() % 2 == 0 ? 0:1;

Integer tempI= null;for(;index

tempI= source.get(index) * 2;

source.set(index,tempI>9?tempI-9:tempI);

}int result =source.stream().mapToInt(Integer::intValue).sum();return result % 10 == 0;

}

一如既往的流写法,这脑子真好使。。。

public static booleanvalidate(String n) {final boolean[] flag = {(n.length() & 1) == 1};returnArrays.stream(

n.split(""))

.map(Integer::parseInt)

.mapToInt(value->value)

.map(integer-> ((flag[0] ^= true) ? (integer * 2 - 1) % 9 + 1: integer))

.sum()% 10 == 0;

}

题目:投掷5次6面骰子,根据规则统计分数

Three 1's => 1000 points

Three 6's => 600 points

Three 5's => 500 points

Three 4's => 400 points

Three 3's => 300 points

Three 2's => 200 points

One 1 => 100 points

One 5 => 50 point

思路:先组合一下,然后根据规则计算对应的值

public classGreed{public static int greedy(int[] dice){

Map resultMap = Arrays.stream(dice).boxed().collect(Collectors.groupingBy(k->k,Collectors.counting()));

AtomicInteger point= newAtomicInteger();

resultMap.forEach((key,value)->{switch(key) {case 1:

point.getAndAdd(((value/3)*1000)+(value%3)*100);break;case 2:

point.getAndAdd(value- 3 >= 0 ? 200 : 0);break;case 3:

point.getAndAdd(value- 3 >= 0 ? 300 : 0);break;case 4:

point.getAndAdd(value- 3 >= 0 ? 400 : 0);break;case 5:

point.getAndAdd(((value/3)*500)+(value%3)*50);break;case 6:

point.getAndAdd(value- 3 >= 0 ? 600 : 0);break;default:break;

}

});returnpoint.intValue();

}

}

其实大道至简。。用流其实还搞复杂了点。

public static int greedy(int[] dice) {int n[] = new int[7];for (int d : dice) n[d]++;return n[1]/3*1000 + n[1]%3*100 + n[2]/3*200 + n[3]/3*300 + n[4]/3*400 + n[5]/3*500 + n[5]%3*50 + n[6]/3*600;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值