First non-repeating letter











up vote
5
down vote

favorite












The problem: find and return the first nonrepeating character in a string, if the string does not have a nonrepeating character return an empty string. For purposes of finding the nonrepeating character it's case insensitive so 't' and 'T' appearing in the string would imply that that 't' and 'T' are not candidates for a nonrepeating character. When you return the character you must return it as its original case.



My Solution:



def non_repeat(_str):
counts = {}
for pos, letter in enumerate(_str.lower()):
if letter not in counts:
counts[letter] = (0, pos)
incr_val = counts[letter][0] + 1
counts[letter] = (incr_val, pos)
for letter in _str.lower():
if counts[letter][0] == 1:
return _str[counts[letter][1]]
return ''


How can I improve the readability of my solution? In particular, I don't like:





  • counts[letter][0] because the 0 index is a bit ambiguous.

  • calculating the incremented value as another line, incr_val; it'd be nice to do the incrementing and updating of the dict in one line.


Anything else you could make more readable? I should add that I'm aware of collections.​Counter; for this solution I'd like to avoid using it.










share|improve this question




















  • 4




    I rolled back your last edit. After getting an answer you are not allowed to change your code anymore. This is to ensure that answers do not get invalidated and have to hit a moving target. If you have changed your code you can either post it as an answer (if it would constitute a code review) or ask a new question with your changed code (linking back to this one as reference). Refer to this post for more information
    – Sᴀᴍ Onᴇᴌᴀ
    1 hour ago















up vote
5
down vote

favorite












The problem: find and return the first nonrepeating character in a string, if the string does not have a nonrepeating character return an empty string. For purposes of finding the nonrepeating character it's case insensitive so 't' and 'T' appearing in the string would imply that that 't' and 'T' are not candidates for a nonrepeating character. When you return the character you must return it as its original case.



My Solution:



def non_repeat(_str):
counts = {}
for pos, letter in enumerate(_str.lower()):
if letter not in counts:
counts[letter] = (0, pos)
incr_val = counts[letter][0] + 1
counts[letter] = (incr_val, pos)
for letter in _str.lower():
if counts[letter][0] == 1:
return _str[counts[letter][1]]
return ''


How can I improve the readability of my solution? In particular, I don't like:





  • counts[letter][0] because the 0 index is a bit ambiguous.

  • calculating the incremented value as another line, incr_val; it'd be nice to do the incrementing and updating of the dict in one line.


Anything else you could make more readable? I should add that I'm aware of collections.​Counter; for this solution I'd like to avoid using it.










share|improve this question




















  • 4




    I rolled back your last edit. After getting an answer you are not allowed to change your code anymore. This is to ensure that answers do not get invalidated and have to hit a moving target. If you have changed your code you can either post it as an answer (if it would constitute a code review) or ask a new question with your changed code (linking back to this one as reference). Refer to this post for more information
    – Sᴀᴍ Onᴇᴌᴀ
    1 hour ago













up vote
5
down vote

favorite









up vote
5
down vote

favorite











The problem: find and return the first nonrepeating character in a string, if the string does not have a nonrepeating character return an empty string. For purposes of finding the nonrepeating character it's case insensitive so 't' and 'T' appearing in the string would imply that that 't' and 'T' are not candidates for a nonrepeating character. When you return the character you must return it as its original case.



My Solution:



def non_repeat(_str):
counts = {}
for pos, letter in enumerate(_str.lower()):
if letter not in counts:
counts[letter] = (0, pos)
incr_val = counts[letter][0] + 1
counts[letter] = (incr_val, pos)
for letter in _str.lower():
if counts[letter][0] == 1:
return _str[counts[letter][1]]
return ''


How can I improve the readability of my solution? In particular, I don't like:





  • counts[letter][0] because the 0 index is a bit ambiguous.

  • calculating the incremented value as another line, incr_val; it'd be nice to do the incrementing and updating of the dict in one line.


Anything else you could make more readable? I should add that I'm aware of collections.​Counter; for this solution I'd like to avoid using it.










share|improve this question















The problem: find and return the first nonrepeating character in a string, if the string does not have a nonrepeating character return an empty string. For purposes of finding the nonrepeating character it's case insensitive so 't' and 'T' appearing in the string would imply that that 't' and 'T' are not candidates for a nonrepeating character. When you return the character you must return it as its original case.



My Solution:



def non_repeat(_str):
counts = {}
for pos, letter in enumerate(_str.lower()):
if letter not in counts:
counts[letter] = (0, pos)
incr_val = counts[letter][0] + 1
counts[letter] = (incr_val, pos)
for letter in _str.lower():
if counts[letter][0] == 1:
return _str[counts[letter][1]]
return ''


How can I improve the readability of my solution? In particular, I don't like:





  • counts[letter][0] because the 0 index is a bit ambiguous.

  • calculating the incremented value as another line, incr_val; it'd be nice to do the incrementing and updating of the dict in one line.


Anything else you could make more readable? I should add that I'm aware of collections.​Counter; for this solution I'd like to avoid using it.







python python-3.x






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 57 mins ago









Toby Speight

23.2k638110




23.2k638110










asked 2 hours ago









Kevin S

785




785








  • 4




    I rolled back your last edit. After getting an answer you are not allowed to change your code anymore. This is to ensure that answers do not get invalidated and have to hit a moving target. If you have changed your code you can either post it as an answer (if it would constitute a code review) or ask a new question with your changed code (linking back to this one as reference). Refer to this post for more information
    – Sᴀᴍ Onᴇᴌᴀ
    1 hour ago














  • 4




    I rolled back your last edit. After getting an answer you are not allowed to change your code anymore. This is to ensure that answers do not get invalidated and have to hit a moving target. If you have changed your code you can either post it as an answer (if it would constitute a code review) or ask a new question with your changed code (linking back to this one as reference). Refer to this post for more information
    – Sᴀᴍ Onᴇᴌᴀ
    1 hour ago








4




4




I rolled back your last edit. After getting an answer you are not allowed to change your code anymore. This is to ensure that answers do not get invalidated and have to hit a moving target. If you have changed your code you can either post it as an answer (if it would constitute a code review) or ask a new question with your changed code (linking back to this one as reference). Refer to this post for more information
– Sᴀᴍ Onᴇᴌᴀ
1 hour ago




I rolled back your last edit. After getting an answer you are not allowed to change your code anymore. This is to ensure that answers do not get invalidated and have to hit a moving target. If you have changed your code you can either post it as an answer (if it would constitute a code review) or ask a new question with your changed code (linking back to this one as reference). Refer to this post for more information
– Sᴀᴍ Onᴇᴌᴀ
1 hour ago










2 Answers
2






active

oldest

votes

















up vote
4
down vote



accepted










I would separate counting from keeping the initial positions. This would allow to use collections.defaultdict for counting and simplify the code and contribute to readability:



from collections import defaultdict


def non_repeat(input_string):
counts = defaultdict(int)
positions = {}

for position, letter in enumerate(input_string.lower()):
counts[letter] += 1
positions[letter] = position

for letter in input_string.lower():
if counts[letter] == 1:
return input_string[positions[letter]]

return ''





share|improve this answer























  • I think you're on the right track. What if a defaultdict(int) was also used for initial_positions? This simplifies your line "if letter not in initial_positions".
    – Kevin S
    2 hours ago










  • @KevinS well, I think the initial_positions has to stay as a regular dictionary as we are only recording the first position of the letter, right?
    – alecxe
    1 hour ago






  • 1




    We only care about characters that have one occurrence, and in particular we only care about the first character that has one occurrence. As a result the initial position for the character we care about will be correct, the others won't, but we don't care that they're not accurate, they're not what we're after
    – Kevin S
    1 hour ago






  • 1




    @KevinS yeah, this means that we don't really need the if letter not in initial_positions check.
    – alecxe
    1 hour ago










  • @KevinS readability wise, I think we are at a good stage. We might though save on memory and think of encoding the position into the counts values to avoid storing positions separately in positions.
    – alecxe
    1 hour ago


















up vote
3
down vote













Going further from alecxe's answer:




  • you could use the Counter collections instead of performing the counting yourself - I didn't see that this was avoided on purpose.

  • you can ensure lower is called only once


You'd get something like:



from collections import Counter

def non_repeat(input_string):
lower = input_string.lower()
count = Counter(lower)
for c, l in zip(input_string, lower):
if count[l] == 1:
return c
return ''


or, for a Counter-less solution:



def non_repeat(input_string):
lower = input_string.lower()
count = defaultdict(int)
for c in lower:
count[c] += 1
for c, l in zip(input_string, lower):
if count[l] == 1:
return c
return ''


Also, here's a quick test suite I wrote:



tests = [
('', ''),
('AA', ''),
('AAABBB', ''),
('AAABBBc', 'c'),
('azerty', 'a'),
('aazzeerty', 'r'),
('azerAZERty', 't'),
]

for inp, out in tests:
assert non_repeat(inp) == out





share|improve this answer



















  • 1




    The question did specifically state that Kevin is avoiding collections.​Counter, so that's not such a helpful suggestion. The rest makes sense.
    – Toby Speight
    54 mins ago






  • 1




    @TobySpeight Thanks for spotting this, I completely missed in the the original question. I've updated my answer accordingly but it is not that relevant anymore :)
    – Josay
    42 mins ago











Your Answer





StackExchange.ifUsing("editor", function () {
return StackExchange.using("mathjaxEditing", function () {
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
});
});
}, "mathjax-editing");

StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "196"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f209622%2ffirst-non-repeating-letter%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























2 Answers
2






active

oldest

votes








2 Answers
2






active

oldest

votes









active

oldest

votes






active

oldest

votes








up vote
4
down vote



accepted










I would separate counting from keeping the initial positions. This would allow to use collections.defaultdict for counting and simplify the code and contribute to readability:



from collections import defaultdict


def non_repeat(input_string):
counts = defaultdict(int)
positions = {}

for position, letter in enumerate(input_string.lower()):
counts[letter] += 1
positions[letter] = position

for letter in input_string.lower():
if counts[letter] == 1:
return input_string[positions[letter]]

return ''





share|improve this answer























  • I think you're on the right track. What if a defaultdict(int) was also used for initial_positions? This simplifies your line "if letter not in initial_positions".
    – Kevin S
    2 hours ago










  • @KevinS well, I think the initial_positions has to stay as a regular dictionary as we are only recording the first position of the letter, right?
    – alecxe
    1 hour ago






  • 1




    We only care about characters that have one occurrence, and in particular we only care about the first character that has one occurrence. As a result the initial position for the character we care about will be correct, the others won't, but we don't care that they're not accurate, they're not what we're after
    – Kevin S
    1 hour ago






  • 1




    @KevinS yeah, this means that we don't really need the if letter not in initial_positions check.
    – alecxe
    1 hour ago










  • @KevinS readability wise, I think we are at a good stage. We might though save on memory and think of encoding the position into the counts values to avoid storing positions separately in positions.
    – alecxe
    1 hour ago















up vote
4
down vote



accepted










I would separate counting from keeping the initial positions. This would allow to use collections.defaultdict for counting and simplify the code and contribute to readability:



from collections import defaultdict


def non_repeat(input_string):
counts = defaultdict(int)
positions = {}

for position, letter in enumerate(input_string.lower()):
counts[letter] += 1
positions[letter] = position

for letter in input_string.lower():
if counts[letter] == 1:
return input_string[positions[letter]]

return ''





share|improve this answer























  • I think you're on the right track. What if a defaultdict(int) was also used for initial_positions? This simplifies your line "if letter not in initial_positions".
    – Kevin S
    2 hours ago










  • @KevinS well, I think the initial_positions has to stay as a regular dictionary as we are only recording the first position of the letter, right?
    – alecxe
    1 hour ago






  • 1




    We only care about characters that have one occurrence, and in particular we only care about the first character that has one occurrence. As a result the initial position for the character we care about will be correct, the others won't, but we don't care that they're not accurate, they're not what we're after
    – Kevin S
    1 hour ago






  • 1




    @KevinS yeah, this means that we don't really need the if letter not in initial_positions check.
    – alecxe
    1 hour ago










  • @KevinS readability wise, I think we are at a good stage. We might though save on memory and think of encoding the position into the counts values to avoid storing positions separately in positions.
    – alecxe
    1 hour ago













up vote
4
down vote



accepted







up vote
4
down vote



accepted






I would separate counting from keeping the initial positions. This would allow to use collections.defaultdict for counting and simplify the code and contribute to readability:



from collections import defaultdict


def non_repeat(input_string):
counts = defaultdict(int)
positions = {}

for position, letter in enumerate(input_string.lower()):
counts[letter] += 1
positions[letter] = position

for letter in input_string.lower():
if counts[letter] == 1:
return input_string[positions[letter]]

return ''





share|improve this answer














I would separate counting from keeping the initial positions. This would allow to use collections.defaultdict for counting and simplify the code and contribute to readability:



from collections import defaultdict


def non_repeat(input_string):
counts = defaultdict(int)
positions = {}

for position, letter in enumerate(input_string.lower()):
counts[letter] += 1
positions[letter] = position

for letter in input_string.lower():
if counts[letter] == 1:
return input_string[positions[letter]]

return ''






share|improve this answer














share|improve this answer



share|improve this answer








edited 1 hour ago

























answered 2 hours ago









alecxe

14.5k53277




14.5k53277












  • I think you're on the right track. What if a defaultdict(int) was also used for initial_positions? This simplifies your line "if letter not in initial_positions".
    – Kevin S
    2 hours ago










  • @KevinS well, I think the initial_positions has to stay as a regular dictionary as we are only recording the first position of the letter, right?
    – alecxe
    1 hour ago






  • 1




    We only care about characters that have one occurrence, and in particular we only care about the first character that has one occurrence. As a result the initial position for the character we care about will be correct, the others won't, but we don't care that they're not accurate, they're not what we're after
    – Kevin S
    1 hour ago






  • 1




    @KevinS yeah, this means that we don't really need the if letter not in initial_positions check.
    – alecxe
    1 hour ago










  • @KevinS readability wise, I think we are at a good stage. We might though save on memory and think of encoding the position into the counts values to avoid storing positions separately in positions.
    – alecxe
    1 hour ago


















  • I think you're on the right track. What if a defaultdict(int) was also used for initial_positions? This simplifies your line "if letter not in initial_positions".
    – Kevin S
    2 hours ago










  • @KevinS well, I think the initial_positions has to stay as a regular dictionary as we are only recording the first position of the letter, right?
    – alecxe
    1 hour ago






  • 1




    We only care about characters that have one occurrence, and in particular we only care about the first character that has one occurrence. As a result the initial position for the character we care about will be correct, the others won't, but we don't care that they're not accurate, they're not what we're after
    – Kevin S
    1 hour ago






  • 1




    @KevinS yeah, this means that we don't really need the if letter not in initial_positions check.
    – alecxe
    1 hour ago










  • @KevinS readability wise, I think we are at a good stage. We might though save on memory and think of encoding the position into the counts values to avoid storing positions separately in positions.
    – alecxe
    1 hour ago
















I think you're on the right track. What if a defaultdict(int) was also used for initial_positions? This simplifies your line "if letter not in initial_positions".
– Kevin S
2 hours ago




I think you're on the right track. What if a defaultdict(int) was also used for initial_positions? This simplifies your line "if letter not in initial_positions".
– Kevin S
2 hours ago












@KevinS well, I think the initial_positions has to stay as a regular dictionary as we are only recording the first position of the letter, right?
– alecxe
1 hour ago




@KevinS well, I think the initial_positions has to stay as a regular dictionary as we are only recording the first position of the letter, right?
– alecxe
1 hour ago




1




1




We only care about characters that have one occurrence, and in particular we only care about the first character that has one occurrence. As a result the initial position for the character we care about will be correct, the others won't, but we don't care that they're not accurate, they're not what we're after
– Kevin S
1 hour ago




We only care about characters that have one occurrence, and in particular we only care about the first character that has one occurrence. As a result the initial position for the character we care about will be correct, the others won't, but we don't care that they're not accurate, they're not what we're after
– Kevin S
1 hour ago




1




1




@KevinS yeah, this means that we don't really need the if letter not in initial_positions check.
– alecxe
1 hour ago




@KevinS yeah, this means that we don't really need the if letter not in initial_positions check.
– alecxe
1 hour ago












@KevinS readability wise, I think we are at a good stage. We might though save on memory and think of encoding the position into the counts values to avoid storing positions separately in positions.
– alecxe
1 hour ago




@KevinS readability wise, I think we are at a good stage. We might though save on memory and think of encoding the position into the counts values to avoid storing positions separately in positions.
– alecxe
1 hour ago












up vote
3
down vote













Going further from alecxe's answer:




  • you could use the Counter collections instead of performing the counting yourself - I didn't see that this was avoided on purpose.

  • you can ensure lower is called only once


You'd get something like:



from collections import Counter

def non_repeat(input_string):
lower = input_string.lower()
count = Counter(lower)
for c, l in zip(input_string, lower):
if count[l] == 1:
return c
return ''


or, for a Counter-less solution:



def non_repeat(input_string):
lower = input_string.lower()
count = defaultdict(int)
for c in lower:
count[c] += 1
for c, l in zip(input_string, lower):
if count[l] == 1:
return c
return ''


Also, here's a quick test suite I wrote:



tests = [
('', ''),
('AA', ''),
('AAABBB', ''),
('AAABBBc', 'c'),
('azerty', 'a'),
('aazzeerty', 'r'),
('azerAZERty', 't'),
]

for inp, out in tests:
assert non_repeat(inp) == out





share|improve this answer



















  • 1




    The question did specifically state that Kevin is avoiding collections.​Counter, so that's not such a helpful suggestion. The rest makes sense.
    – Toby Speight
    54 mins ago






  • 1




    @TobySpeight Thanks for spotting this, I completely missed in the the original question. I've updated my answer accordingly but it is not that relevant anymore :)
    – Josay
    42 mins ago















up vote
3
down vote













Going further from alecxe's answer:




  • you could use the Counter collections instead of performing the counting yourself - I didn't see that this was avoided on purpose.

  • you can ensure lower is called only once


You'd get something like:



from collections import Counter

def non_repeat(input_string):
lower = input_string.lower()
count = Counter(lower)
for c, l in zip(input_string, lower):
if count[l] == 1:
return c
return ''


or, for a Counter-less solution:



def non_repeat(input_string):
lower = input_string.lower()
count = defaultdict(int)
for c in lower:
count[c] += 1
for c, l in zip(input_string, lower):
if count[l] == 1:
return c
return ''


Also, here's a quick test suite I wrote:



tests = [
('', ''),
('AA', ''),
('AAABBB', ''),
('AAABBBc', 'c'),
('azerty', 'a'),
('aazzeerty', 'r'),
('azerAZERty', 't'),
]

for inp, out in tests:
assert non_repeat(inp) == out





share|improve this answer



















  • 1




    The question did specifically state that Kevin is avoiding collections.​Counter, so that's not such a helpful suggestion. The rest makes sense.
    – Toby Speight
    54 mins ago






  • 1




    @TobySpeight Thanks for spotting this, I completely missed in the the original question. I've updated my answer accordingly but it is not that relevant anymore :)
    – Josay
    42 mins ago













up vote
3
down vote










up vote
3
down vote









Going further from alecxe's answer:




  • you could use the Counter collections instead of performing the counting yourself - I didn't see that this was avoided on purpose.

  • you can ensure lower is called only once


You'd get something like:



from collections import Counter

def non_repeat(input_string):
lower = input_string.lower()
count = Counter(lower)
for c, l in zip(input_string, lower):
if count[l] == 1:
return c
return ''


or, for a Counter-less solution:



def non_repeat(input_string):
lower = input_string.lower()
count = defaultdict(int)
for c in lower:
count[c] += 1
for c, l in zip(input_string, lower):
if count[l] == 1:
return c
return ''


Also, here's a quick test suite I wrote:



tests = [
('', ''),
('AA', ''),
('AAABBB', ''),
('AAABBBc', 'c'),
('azerty', 'a'),
('aazzeerty', 'r'),
('azerAZERty', 't'),
]

for inp, out in tests:
assert non_repeat(inp) == out





share|improve this answer














Going further from alecxe's answer:




  • you could use the Counter collections instead of performing the counting yourself - I didn't see that this was avoided on purpose.

  • you can ensure lower is called only once


You'd get something like:



from collections import Counter

def non_repeat(input_string):
lower = input_string.lower()
count = Counter(lower)
for c, l in zip(input_string, lower):
if count[l] == 1:
return c
return ''


or, for a Counter-less solution:



def non_repeat(input_string):
lower = input_string.lower()
count = defaultdict(int)
for c in lower:
count[c] += 1
for c, l in zip(input_string, lower):
if count[l] == 1:
return c
return ''


Also, here's a quick test suite I wrote:



tests = [
('', ''),
('AA', ''),
('AAABBB', ''),
('AAABBBc', 'c'),
('azerty', 'a'),
('aazzeerty', 'r'),
('azerAZERty', 't'),
]

for inp, out in tests:
assert non_repeat(inp) == out






share|improve this answer














share|improve this answer



share|improve this answer








edited 43 mins ago

























answered 59 mins ago









Josay

24.6k13783




24.6k13783








  • 1




    The question did specifically state that Kevin is avoiding collections.​Counter, so that's not such a helpful suggestion. The rest makes sense.
    – Toby Speight
    54 mins ago






  • 1




    @TobySpeight Thanks for spotting this, I completely missed in the the original question. I've updated my answer accordingly but it is not that relevant anymore :)
    – Josay
    42 mins ago














  • 1




    The question did specifically state that Kevin is avoiding collections.​Counter, so that's not such a helpful suggestion. The rest makes sense.
    – Toby Speight
    54 mins ago






  • 1




    @TobySpeight Thanks for spotting this, I completely missed in the the original question. I've updated my answer accordingly but it is not that relevant anymore :)
    – Josay
    42 mins ago








1




1




The question did specifically state that Kevin is avoiding collections.​Counter, so that's not such a helpful suggestion. The rest makes sense.
– Toby Speight
54 mins ago




The question did specifically state that Kevin is avoiding collections.​Counter, so that's not such a helpful suggestion. The rest makes sense.
– Toby Speight
54 mins ago




1




1




@TobySpeight Thanks for spotting this, I completely missed in the the original question. I've updated my answer accordingly but it is not that relevant anymore :)
– Josay
42 mins ago




@TobySpeight Thanks for spotting this, I completely missed in the the original question. I've updated my answer accordingly but it is not that relevant anymore :)
– Josay
42 mins ago


















draft saved

draft discarded




















































Thanks for contributing an answer to Code Review Stack Exchange!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


Use MathJax to format equations. MathJax reference.


To learn more, see our tips on writing great answers.





Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


Please pay close attention to the following guidance:


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f209622%2ffirst-non-repeating-letter%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Trompette piccolo

Slow SSRS Report in dynamic grouping and multiple parameters

Simon Yates (cyclisme)