給定一串數字和一個數字 n String = 500055 n = 2
然后輸出-> 510352 解釋:這里我計算連續數字的頻率并存盤它們。在 500055 中,
5 連續發生 1 次 --- ( 51 )
0 連續出現 3 次 --- (51 03 )
5 連續發生 2 次 --- (5103 52 )
例子2:
字串 = 500055
n = 3
500055 -> 510352 -> 511101315121
(基本上在 n=2 上再次應用相同的功能)
示例 3:
字串 = 500055
n = 4
500055 -> 510352 -> 511101315121 -> 51130111311151112111
示例 4:
字串 = 500055
n = 1
輸出 500055
有沒有辦法一次性解決這個問題?
像:字串 = 500055 n = 4
500055 -> 51130111311151112111
如果字串的大小是 k 那么有沒有辦法在 O(k) 中解決這個問題?
uj5u.com熱心網友回復:
您可以streams用于該作業:
public static String frequency(String digits, int n) {
return n < 2 ? digits : frequency(frequency(digits), n - 1);
}
public static String frequency(String digits) {
return IntStream.range(0, digits.length())
.filter(i -> i == digits.length() - 1 || digits.charAt(i) != digits.charAt(i 1))
.mapToObj(i -> String.valueOf(digits.charAt(i))
(i == 0 ? i 1 : IntStream.range(0, i)
.filter(j -> digits.substring(j, i).chars()
.allMatch(c -> c == digits.charAt(i)))
.count() 1))
.collect(Collectors.joining());
}
然后:
String digits = "500055";
System.out.println("n = 1: " frequency(digits, 1));
System.out.println("n = 2: " frequency(digits, 2));
System.out.println("n = 3: " frequency(digits, 3));
System.out.println("n = 4: " frequency(digits, 4));
輸出:
n = 1: 500055
n = 2: 510352
n = 3: 511101315121
n = 4: 51130111311151112111
uj5u.com熱心網友回復:
聽起來您想知道是否有一些預測公式可以使用。由于實際數字會根據以前的構造而變化,因此我認為這不太可能(至少在數學上不是直接的 - 但我可能是錯的)。無論如何,這肯定更快(對我而言)推匯出來并且您不需要明確地計算任何東西。只需使用 aregex和String.length方法。
String start = "500055";
for (int n = 0; n < 4; n ) {
String s = consecutiveCount(start, n);
System.out.printf("n = %d : %s -> %s%n", n, start, s);
}
印刷
n = 0 : 500055 -> 500055
n = 1 : 500055 -> 510352
n = 2 : 500055 -> 511101315121
n = 3 : 500055 -> 51130111311151112111
方法。
(\\d)\\1*- 捕獲一個數字后跟 0 個或多個相同數字(使用對group1.- 連接字符 in
group1后跟整個匹配項的長度 (group0)。 find()找到下一個匹配項。重復直到它回傳 false- 然后
matcher為新字串創建一個新字串。 - 將字串設定為空。
- 并繼續下一次迭代。
final static String REGEX = "(\\d)\\1*";
final static Pattern PATTERN = Pattern.compile(REGEX);
public static String consecutiveCount(String str, int iterations) {
while (iterations-- > 0) {
Matcher m = PATTERN.matcher(str);
str = "";
while (m.find()) {
str = m.group(1) ""
m.group(0).length();
}
}
return str;
}
注意:正如我在評論中提到的,您可能需要更改您或我對 n
如果您愿意,這里有一個簡單的非正則運算式解決方案。在大多數情況下,邏輯與以前的版本非常相似。
- 設定
count為1(始終保證計數為 1) - 用特殊字符終止字串
#。這簡化了代碼以允許處理字串末尾的連續字符。 - 如果當前字符和后面的字符相等,則增加
count。 - 否則,將字符及其計數附加到
str. - 設定
count為1并繼續下一次迭代。
public static String consecutiveCount(String str,
int iterations) {
while (iterations-- > 0) {
int count = 1;
str = "#";
char[] chars = str.toCharArray();
str = "";
for (int i = 0; i < chars.length - 1; i ) {
if (chars[i] == chars[i 1]) {
count ;
} else {
str = (char) chars[i] "" count;
count = 1;
}
}
}
return str;
}
幾個觀察。
a count > 3(除了初始字串 like
8888永遠不會出現。要看到這一點,請考慮要發生這種情況,必須有一個模式 likexxxx決議為x4。但是 的值x后面不能跟任何其他計數x一樣已包含在該計數中。并且xxx必須是其計數后跟的下一個數字在x3y哪里y。像
567總是介于 5,6,7 之間的模式(每個只會出現一次)。567 -> (5)1(6)1(7)1 -> (5)111(6)111(7)111 -> (5)113(6)113(7)113 -> ...
這是有效的,因為 5、6 和 7 不能是計數值。的起始模式123更復雜,并且不遵循相同的規則。但一種模式仍然會出現。
uj5u.com熱心網友回復:
您可以使用此代碼 javascript 倒計時 10 秒:
var timeleft = 10;
var downloadTimer = setInterval(function(){
if(timeleft <= 0){
clearInterval(downloadTimer);
}
document.getElementById("progressBar").value = 10 - timeleft;
timeleft -= 1;
}, 1000);
<progress value="0" max="10" id="progressBar"></progress>
javascript中的倒計時:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Countdown timer using HTML and JavaScript</title>
</head>
<body>
Registration closes in <span id="timer">05:00<span> minutes!
<!-- custom js -->
<script>
window.onload = function () {
var minute = 5;
var sec = 60;
setInterval(function () {
document.getElementById("timer").innerHTML =
minute " : " sec;
sec--;
if (sec == 00) {
minute--;
sec = 60;
if (minute == 0) {
minute = 5;
}
}
}, 1000);
};
</script>
</body>
</html>
js中的倒計時:
<body>
<div>Registration closes in <span id="time">05:00</span> minutes!</div>
</body>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/368774.html
