After all, aren’t you told to trust your instincts?
StartupBus Florida departs Tampa on Wednesday, July 27, and it’s not too late to get in on the opportunities it presents!
Opportunity #1: Get away from your day-to-day and go on an adventure!
Whether you go to an office, work from home, some combo of the previous two, or are looking for work, StartupBus Florida offers a chance to break away from your daily routine and spend a few unpredictable, exciting, and challenging days on the road building a startup and the application that supports it.
Opportunity #2: Try new tools or use familiar ones in completely new ways!

Have you been looking for an opportunity to try out a new tool, programming language, framework, API or service, but haven’t been able to because you’ve been bogged down with your day-to-day work? StartupBus Florida is your chance!
…or…
Have you been looking for an opportunity to stretch by taking a tool, programming language, framework, API or service that you’re quite familiar with, and using it in new ways or for new purposes? Again, StartupBus Florida is your chance!
Opportunity #3: See America!
The map below shows StartupBus Florida’s 2019 route from Tampa that year’s destination city, New Orleans:
Among other things, it provided us buspreneurs with a chance to see parts of the country that many of us normally don’t get to see and meet people that we normally wouldn’t get to meet.
This’s year’s destination city is Austin, Texas! Since it’s a different destination city, we’re going to take a different route, with different stops in different places with different people. But the opportunity to see different places and people will still be there.
Opportunity #4: Road trip to the delightfully weird city of Austin, Texas!

Austin is just plain fun. It’s a mishmash of alternative, Latino, Texan, and college cultures that combine to make it a great place to get great food and drink in a lively party atmosphere, catch some great live music, see some stunning sights, and meet some great people. It’s also where the semi-finals and finals will take place (remember, you’ll spend the Wednesday, July 27th through Friday, July 29th on the bus to Austin, followed by 2 days in Austin: the semi-finals on Saturday, July 30th and the finals on Sunday, July 31st).
Opportunity #5: Supercharge your resume!
As I wrote in a previous post, StartupBus looks good on a resume.
Every resume lists experience working in an office, whether in a traditional office space, a coworking space, or someone’s home. Only a select few list the experience of working on a bus to create a startup and its supporting application in an handful of days. This is the kind of experience that speaks to your skills, resilience, creativity, positivity, and ambition. A ride on StartupBus supercharged my resume, and it can supercharge yours, too!
Opportunity #6: Boost your company profile with a sponsorship!

StartupBus is a crazy idea — what person in their right mind would build a business and its supporting technology in three days on a bus?
But the truth is that technological advances start as “crazy ideas,” from the lever, to turning steam into mechanical motion, to powered flight and space travel, to turning a system for physicists to share notes over the internet into something completely different, to taking the power of a touchscreen computer and showing it into a phone.
StartupBus has also created a number of advances, from Instacart to the advances in careers for many of its participants (Yours Truly included), and it can also advance your company’s profile if you decide to be a sponsor. You too can be part of this crazy idea, and we’ll make sure that your praises are sung if you sponsor us!
(Want to be a StartupBus Florida sponsor and get praise from the entire StartupBus organization as well as Tampa Bay’s number one tech blog? Drop me a line and find out more.)
Do you want in on these opportunities? Register now!
Find out more on the official StartupBus site and register here (you’ll need a code to register — you can use JOEY22)!
Assorted developer humor











While getting groceries, I saw this endcap for cotton candy-flavored energy drink. The “XBox controller as phone” pose is silly, but it also reminded me of a phone I’d wanted way back in the early 2000s: the Nokia N-Gage.
Released in 2003 (in the pre-smartphone era, back when mobile phones sported a lot of dedicated buttons), the N-Gage was a phone-meets-handheld gaming device. IGN summed it up best as “a bad console filled with bad games,” and it didn’t help that the speaker and microphone were mounted on its side. In order to use it as a phone, you’d have to hold it like this — a position that would come to be known as sidetalking:


Sidetalking looked silly, so soon there were sidetalking photos featuring people using the N-Gage while making silly faces…


…followed by people ditching the N-Gage altogether and opting to take sidetalking photos with any old electronic thing, turning it into a full-blown meme:



I even got on the fun, using my device of choice:

In case you’re wondering, I’m not really pining for the N-Gage anymore. My iPhone 13 Pro is a decent gaming phone, and on the Android side, I’ve got a Nubia Redmagic 6R that plays Genshin Impact rather nicely.
Right up to its cancellation, the Elon Musk / Twitter deal increasingly looked like Robot Chicken’s parody of the Darth Vader / Lando Calrissian deal:

In the previous installment in the How to solve coding interview questions series, I showed you my Python solution for the challenge “Find the first NON-recurring character in a string,” which is a follow-up to the challenge “Find the first recurring character in a string.”
A couple of readers posted their solution in the comments, and I decided to take a closer look at them. I also decided to write my own JavaScript solution, which led me to refine my Python solution.
“CK”’s JavaScript solution
The first reader-submitted solution comes from “CK,” who submitted a JavaScript solution that uses sets:
// JavaScript
function findFirstNonRepeatingChar(chars) {
let uniqs = new Set();
let repeats = new Set();
for (let ch of chars) {
if (! uniqs.has(ch)) {
uniqs.add(ch);
} else {
repeats.add(ch);
}
}
for (let ch of uniqs) {
if (! repeats.has(ch)) {
return ch;
}
}
return null;
}
The one thing that all programming languages that implement a set data structure is that every element in a set must be unique — you can’t put more than one of a specific element inside a set. If you try to add an element to a set that already contains that element, the set will simply ignore the addition.
In mathematics, the order of elements inside a set doesn’t matter. When it comes to programming languages, it varies — JavaScript preserves insertion order (that is, the order of items in a set is the same as the order in which they were added to the set) while Python doesn’t.
CK’s solution uses two sets: uniqs
and repeats
. It steps through the input string character by character and does the following:
- If
uniqs
does not contain the current character, it means that we haven’t seen it before. Add the current character touniqs
, the set of characters that might be unique. - If
uniqs
contains the current character, it means that we’ve seen it before. Add the current character torepeats
, the set of repeated characters.
Once the function has completed the above, it steps through uniqs
character by character, looking for the first character in uniqs
that isn’t in repeats
.
For a string of length n, the function performs the first for
loop n times, and the second for
loop some fraction of n times. So its computational complexity is O(n).
Thanks for the submission, CK!
Dan Budiac’s TypeScript solution
Dan Budiac provided the second submission, which he implemented in TypeScript:
// TypeScript
function firstNonRecurringCharacter(val: string): string | null {
// First, we split up the string into an
// array of individual characters.
const all = val.split('');
// Next, we de-dup the array so we’re not
// doing redundant work.
const unique = [...new Set(all)];
// Lastly, we return the first character in
// the array which occurs only once.
return unique.find((a) => {
const occurrences = all.filter((b) => a === b);
return occurrences.length === 1;
}) ?? null;
}
I really need to take up TypeScript, by the way.
Anyhow, Dan’s approach is similar to CK’s, except that it uses one set instead of two:
- It creates an array,
all
, by splitting the input string into an array made up of its individual characters. - It then creates a set,
unique
, using the contents ofall
. Remember that sets ignore the addition of elements that they already contain, meaning thatunique
will contain only individual instances of the characters fromall
. - It then goes character by character through
unique
, checking the number of times each character appears inall
.
For a string of length n:
- Splitting the input string into the array
all
is O(n). - Creating the set
unique
fromall
is O(n). - The last part of the function features a find() method — O(n) — containing a filter() method — also O(n). That makes this operation O(n2). So the whole function is O(n2).
Thanks for writing in, Dan!
My JavaScript solution that doesn’t use sets
In the meantime, I’d been working on a JavaScript solution. I decided to play it safe and use JavaScript’s Map
object, which holds key-value pairs and remembers the order in which they were inserted — in short, it’s like Python’s dictionaries, but with get()
and set()
syntax.
// JavaScript
function firstNonRecurringCharacter(text) {
// Maps preserve insertion order.
let characterRecord = new Map()
// This is pretty much the same as the first
// for loop in the Python version.
for (const character of text) {
if (characterRecord.has(character)) {
newCount = characterRecord.get(character) + 1
characterRecord.set(character, newCount)
} else {
characterRecord.set(character, 1)
}
}
// Just go through characterRecord item by item
// and return the first key-value pair
// for which the value of count is 1.
for (const [character, count] of characterRecord.entries()) {
if (count == 1) {
return character
}
}
return null
}
The final part of this function takes an approach that’s slightly different from the one in my original Python solution. It simply goes through characterRecord
one key-value pair at a time and returns the key for the first pair it encounters whose value is 1.
It remains an O(n) solution.
My revised Python solution
If I revise my original Python solution to use the algorithm from my JavaScript solution, it becomes this:
# Python
def first_non_recurring_character(text):
character_record = {}
# Go through the text one character at a time
# keeping track of the number of times
# each character appears.
# In Python 3.7 and later, the order of items
# in a dictionary is the order in which they were added.
for character in text:
if character in character_record:
character_record[character] += 1
else:
character_record[character] = 1
# The first non-recurring character, if there is one,
# is the first item in the list of non-recurring characters.
for character in character_record:
if character_record[character] == 1:
return character
return None
This is also an O(n) solution.
Previously in this series
- How to solve coding interview questions: The first NON-recurring character in a string
- Coding interview questions: “First recurring character” in Swift
- How to solve coding interview questions: The first recurring character in a string
- I Has the Dumb (or: How I Embarrassed Myself in My Interview with Google) — from way back in 2013
Here’s an excerpt from the current version of my resume (yes, my resume’s under version control). Note the highlighted entry:
The entry is for Hyve, the startup and application that my StartupBus team built when I rode in 2019. Hyve was a service that let you create “burner” email addresses that relayed email to and from your real email address, allowing you to safely subscribe to services and avoid getting marketing spam or safely communicate with people whom you might not completely trust.
We did all right in the end, landing in the runner-up slot:
…but the real wins came a little bit afterward when I was interviewing for developer and developer relations jobs a couple of weeks afterward. StartupBus makes for a good story, and in a job interview, it’s the story that “sells” you.
After all, StartupBus is a hackathon where you’re challenged to come up with:
- A startup business
- and an application that supports that business
- on a bus
- in three days.
This intrigued the people who interviewed me, which led me to talk about the decisions that shaped the business, which in turn shaped the software. I detailed the challenges of writing business plans and software on a bus, a rumbling, rolling office space with spotty internet access, unreliable power, and the occasional engine breakdown. I also talked about dealing with the compressed timeframe and a few of the tricks we used to get around the limited time, which included getting help from our professional network, taking advantage of crowdsourcing services, and using our media contacts. My StartupBus story played a key part in convincing prospective employers that they wanted to hire me.

StartupBus Florida will depart Tampa, Florida on Wednesday, July 27 and make a 3-day trip with interesting stops and challenges along the way. It will arrive in Austin, Texas on the evening of Friday, July 29, where it will meet with teams from 6 other buses:
On Saturday, July 30, all the teams will assemble at a venue in Austin for the semifinals. Every team will pitch in front of a set of semifinals judges. By the end of the day, a handful of finalists will emerge (Hyve was one of six finalists in 2019).
Those finalists will then go on to the finals, which will take place on Sunday, July 31. They’ll pitch again (and if they’re smart, they’ll have spent the night before reworking their pitch and application) in front of the finals judges, who will select the winner and runners-up.
If you participate in StartupBus, you will come out of it a different person. You will pitch your startup at least a dozen times (and yes, everyone pitches — not just the marketing people, but the creatives and developers, too). You will work on product design. You will work on marketing. You will work on code. And you’ll do it all under far-from-ideal circumstances. StartupBus is a crash course in guerrilla entrepreneurship, and it’s an experience that will serve you well — especially during these economically upside-down times.
And you’d better believe that you’ll have stories to tell, and they’ll help you stand apart from the crowd.
Want to ride StartupBus later this month?
You’ll need to apply on the StartupBus site, and you’ll need an invite code. Use mine: JOEY22, which will tell them that I sent you.