count8 challlenge

on
Hi,
I am working on below challenge

http://codingbat.com/prob/p192383

Given a non-negative int n, compute recursively (no loops) the count of the occurrences of 8 as a digit, except that an 8 with another 8 immediately to its left counts double, so 8818 yields 4. Note that mod (%) by 10 yields the rightmost digit (126 % 10 is 6), while divide (/) by 10 removes the rightmost digit (126 / 10 is 12).

count8(8) → 1
count8(818) → 2
count8(8818) → 4

i am not clear on how to find eight count using recursion. please advise
Comment
Watch Question

Do more with

EXPERT OFFICE® is a registered trademark of EXPERTS EXCHANGE®
Database Expert
Awarded 2016
Top Expert 2016
Commented:
--
``````----

DECLARE @intValue AS VARCHAR(10) = '8818'

SELECT SUM( CASE WHEN SUBSTRING(@intValue,number,1) LIKE '[8]' THEN 1 ELSE 0 END ) Count8DIGITS FROM
(
SELECT DISTINCT number FROM
MASTER..SPT_VALUES WHERE number > 0 AND number <= DATALENGTH(@intValue)
) x

--
--
``````
student

Commented:
This challenge is almost the same as
https://www.experts-exchange.com/questions/28968896/count7-challenge.html
There is just an extra conditional here.

Commented:
I will try

Commented:
``````public int count8(int n) {
if (n < 1) {
return 0;
}
if ((n % 10) == 8){ return 1 + count8(n/10);
}
else {
return count8(n/10);
}
}
``````

above failing some tests
Expected      Run
count8(8) → 1      1      OK
count8(818) → 2      2      OK
count8(8818) → 4      3      X
count8(8088) → 4      3      X
count8(123) → 0      0      OK
count8(81238) → 2      2      OK
count8(88788) → 6      4      X
count8(8234) → 1      1      OK
count8(2348) → 1      1      OK
count8(23884) → 3      2      X
count8(0) → 0      0      OK
count8(1818188) → 5      4      X
count8(8818181) → 5      4      X
count8(1080) → 1      1      OK
count8(188) → 3      2      X
count8(88888) → 9      5      X
count8(9898) → 2      2      OK
count8(78) → 1      1      OK
other tests
X

This challenge is almost the same as
https://www.experts-exchange.com/questions/28968896/count7-challenge.html
There is just an extra conditional here.

what is extra conditional compared to count7 challenge here for count8 challenge?
student

Commented:
what is extra conditional
The challenge stated
except that an 8 with another 8 immediately to its left counts double
So, we need something like
``````    if(n % 10 == 8){
if(next digit is 8)return 2 + count8(n / 10);
else return 1 + count8(n / 10);
}
``````
Database Expert
Awarded 2016
Top Expert 2016

Commented:
Enjoy ! Without Recursion and loop;

--

DECLARE @intValue AS VARCHAR(10) = '1818E8'

SELECT SUM( CASE WHEN SUBSTRING(@intValue,number,1) LIKE '[8]' THEN 1 ELSE 0 END ) Count8DIGITS FROM
(
SELECT DISTINCT number FROM
MASTER..SPT_VALUES WHERE number > 0 AND number <= DATALENGTH(@intValue)
) x

--

Commented:
``````public int count8(int n) {
int result=0;
if (n < 1) {
result=0;
}
if ((n % 10) == 8){
if ((n+1 % 10) == 8){
result= 2 + count8(n/10);
// return result;
}
else{
result= 1 + count8(n/10);
// return result;
}
}
return result;
}
/* else {
return count8(n/10);
}*/
/* if(n % 10 == 8){
if(next digit is 8)return 2 + count8(n / 10);
else return 1 + count8(n / 10);*/

``````

above fails below tests

Expected      Run
count8(8) → 1      1      OK
count8(818) → 2      1      X
count8(8818) → 4      1      X
count8(8088) → 4      2      X
count8(123) → 0      0      OK
count8(81238) → 2      1      X
count8(88788) → 6      2      X
count8(8234) → 1      0      X
count8(2348) → 1      1      OK
count8(23884) → 3      0      X
count8(0) → 0      0      OK
count8(1818188) → 5      2      X
count8(8818181) → 5      0      X
count8(1080) → 1      0      X
count8(188) → 3      2      X
count8(88888) → 9      5      X
count8(9898) → 2      1      X
count8(78) → 1      1      OK
other tests
X

student
Commented:
`````` if ((n+1 % 10) == 8)
``````
That is not what you want to do. That tests whether the present input + 1 has a 8 as its last digit. You want to use n/10 to peek at the input that will follow the present one.

Commented:
``````public int count8(int n) {
int result=0;
if (n < 1) {
result=0;
}
if ((n % 10) == 8){
if ((n/10) == 8){
result= 2 + count8(n/10);
// return result;
}
else{
result= 1 + count8(n/10);
// return result;
}
}
return result;
}
/* else {
return count8(n/10);
}*/
/* if(n % 10 == 8){
if(next digit is 8)return 2 + count8(n / 10);
else return 1 + count8(n / 10);*/
/*That is not what you want to do. That tests whether the present input + 1
has a 8 as its last digit.
You want to use n/10 to peek at the input that will follow the present one.*/
``````
like above?it still fails same tests?

Commented:
I think i got approach.
``````public int count8(int n) {
//int result=0;
if (n < 1) {
return 0;
}
if (n >=88 && n%100==88){

return 2 + count8(n/10);
// return result;
}
else if( n%10==8){
// result= 1 + count8(n/10);
// return result;
return 1 + count8(n/10);
}
return count8(n/10);

// return result;
}
/* else {
return count8(n/10);
}*/
/* if(n % 10 == 8){
if(next digit is 8)return 2 + count8(n / 10);
else return 1 + count8(n / 10);*/
/*That is not what you want to do. That tests whether the present input + 1
has a 8 as its last digit.
You want to use n/10 to peek at the input that will follow the present one.*/
``````

above passed all tests. any improvements or alternate approaches?

Commented:
if then if then else
in above fashion code is there else belong to top if or second(last if in this case)?
student

Commented:
``````  if (n >=88 && n%100==88){
``````
That doesn't look right.
Here is my solution.
``````public int count8(int n) {
if(n == 0)return 0;
if(n % 10 == 8){
if((n / 10) % 10 == 8)return 2 + count8(n / 10);
else return 1 + count8(n / 10);
}
else return count8(n / 10);
}
``````

Commented:
``````public int count8(int n) {
if(n == 0)return 0;
if(n % 10 == 8){
if((n / 10) % 10 == 8)return 2 + count8(n / 10);
else return 1 + count8(n / 10);
}
else return count8(n / 10);
}
``````
i like this approach

Do more with