我不理解循环中的行:我们取字符并减去a
,所以“10”? (为什么?)
那么1 << val
:我们用val换1? (为什么?)
和检查器是0,那么我们如何在条件中达到> 0
?
public static boolean isUniqueChars(String str) {
int checker = 0;
for (int i = 0; i < str.length(); i++) {
int val = str.charAt(i) - 'a';
if ((checker & (1 << val)) > 0) return false;
checker |= (1 << val);
}
return true;
}
由于
答案 0 :(得分:7)
代码假定str
由小写字母组成,如果没有重复字母则返回true。它的工作原理如下:
checker
用作位图,也就是说,此变量中的每个位用于跟踪一个字母。从字符中减去“a”给出'a'为0,为'b'为1,为'c'为2等。将此数字左移1为'a',2为'b',4为'c' '等等。
通过oring(|
)此值与checker
代码会跟踪以前遇到的字符。所以,如果我们遇到第二个'a',例如checker
有第一个位集(在if语句中由&
测试),所以我们知道str
有重复
简而言之,checker
被用作更快更紧凑的bool数组。这种和类似的技术称为bit manipulation。
答案 1 :(得分:1)
str.charAt(i) - 'a'
或多或少地返回“字母表中的字母”:如果str.charAt(i)
为'a'
,则为0
,如果是'b'
,val
为1
,如果z
,val
为25
,依此类推。
其余部分使用了一种比特笨拙的技术:如果val
的{{1}}位是checker
,那么我们已经看到1
个字符已经。因此val
非零,当且仅当checker & (1 << val)
val
置位时,这意味着我们已经看过该字符。否则,我们设置checker
的{{1}}位并继续循环。
答案 2 :(得分:0)
问题已经很久了,但我认为我的回答是正确和清晰的。
我们只在这种情况下处理小写字母。
就像保罗所问的那样,library(ggplot2)
library(shiny)
runApp(shinyApp(
ui = fluidPage(
plotOutput("plot",
brush = brushOpts("plotBrush", delay = 5000)),
actionButton("clear", "Clear")
),
server = function(input, output, session) {
values <- reactiveValues(brush = NULL)
output$plot <- renderPlot({
ggplot(cars, aes(speed, dist)) + geom_point()
})
brush <- reactive({
input$plotBrush
})
observeEvent(input$clear, {
cat(str(brush()))
# clear the brushed area
})
}
))
意味着转移第一个方向。不要转移&#39; val&#39;一个人。例如,&#39;你好&#39;给出:
(1 << val)
我希望这可以解决问题。 如果您想确切了解发生了什么,我会得到源代码。
1st loop: val = 111 in binary, 7 in decimal
1 << val = 10000000 <-- here one is shifted by 7
checker = 10000000
2nd loop: val = 100 in binary, 4 in decimal
1 << val = 10000
checker = 10010000
3rd loop: val = 1011 in binary, 11 in decimal
1 << val = 100000000000
checker = 100010010000
4th loop: val = 1011 in binary, 11 in decimal
1 << val = 100000000000
(checker & (1 << val)) gives 100000000000 which is greater than 0
The loop is over because 'l' is not unique after 'hel' in 'hello'.