Why does StringBuilder result in a longer runtime in this program? - java

I read in another thread that StringBuilder is superior to String Concatenation, especially within loops. However, I solved the problem in two different ways, and the StringBuilder method took nearly double the runtime - The logic is otherwise the same, so why might this be?
class Solution {
public int reverse(int x) {
boolean isNeg = false;
if(x < 0){
x *= -1;
isNeg = true;
}
ArrayList <Character> arrlist = new ArrayList<>();
String reverse = "";
StringBuilder sbdr = new StringBuilder();
String s = Integer.toString(x);
for(int i = 0; i < s.length(); i++) arrlist.add(s.charAt(i));
while(arrlist.get(arrlist.size()-1) == '0' && arrlist.size() > 1) {
arrlist.remove(arrlist.size()-1);
}
for(int i = arrlist.size()-1; i >= 0; i--) sbdr.append(arrlist.get(i));
try {
if(isNeg) return Integer.valueOf(sbdr.toString())*-1;
return Integer.valueOf(sbdr.toString());
} catch (Exception e){
return 0;
}
}
}
class Solution {
public int reverse(int x) {
boolean isNeg = false;
if(x < 0){
x *= -1;
isNeg = true;
}
ArrayList <Character> arrlist = new ArrayList<>();
String reverse = "";
String s = Integer.toString(x);
for(int i = 0; i < s.length(); i++) arrlist.add(s.charAt(i));
while(arrlist.get(arrlist.size()-1) == '0' && arrlist.size() > 1) {
arrlist.remove(arrlist.size()-1);
}
for(int i = arrlist.size()-1; i >= 0; i--) {
reverse += Character.toString(arrlist.get(i));
}
try {
if(isNeg) return Integer.valueOf(reverse)*-1;
else return Integer.valueOf(reverse);
} catch (Exception e){
return 0;
}
}
}

Related

StringBuilder delete method cannot delete all '0' in for loop

I hava a StringBuilder Object named ans which start with lots of '0'. I try to delete all the '0' from the start of the ans until I meet a non '0' charactar.
What confuse me is the for i loop didn't finish his job. I have to make a second for i loop to clear all the 0 in the beginning.
Here is my Code.
public class No402 {
public static void main(String[] args) {
System.out.println(new No402().removeKdigits("42767854615790820292944831840714943359894187047948450037336809401264092298894490339723170235305129677267060933619172682578764724528024649451075131679109777263591648456729485464839877320061461069243974933498371934575012528555827338953724780861662784034839154178040563249817555067081448332223588411419168442553970020118370358794959779864819714402968003470365044797881527445340976945193818119467023653961507607672480115226579679195083984107550649620824228334531543881248523270728845883011347557806714125988595750797445903460187069102923827814511796767245574859856245433535202213866357865001893279481556044431076323101967578726169437167866864433985495890782177337227185218722003203201794524473658120818757906858018522776715639010350584179192618574032568118118609428514149350137179799798509363342933168141703795277960609902578193965353966732758522319326510476003141627976495471194647651191765940623801848650779996861991716801192868381714592671157213385358454372258678286185038661251898041199455484881497973936886129286780686747702354266676649133047345268803970772136574778724059680910889846701031833468068701979269662983956502485168033946609770137842651146059273082836506077338453677150197865590089199161058651336150874965473699606051616750107442277197178936688141691056518266386172813294511346655182323777419242146803539629808395049965699535272276902817614992917612927025979571436056418178949140225831714010026397581438647144388850448143782384993050908181782121784294922444218824177798052454616802442043385673094510700252387351590505241357656396376170570838637068429512330065547472613577751410152513915714166057883408992271281823592172333654887223386232551975763603851710020471730161184180640812534293795148973065648040320936081719321657015873251252438179935213522036777508405231559635933218588146968578575964379037900738820562221783370763718270548271942160879283346733139062721676158522361533668704462398258010274851756504022170692557968534354343300976925558662656552021225536052236166733671370810493478857779656160557033130699196730596823835866942383406014324343783777539237677792451989779191005800821612057527173069156047746886314264888886920021988864698336973375949221207087151293792642382667520852406157133901720414180577613687865572943934469907502558232579505371542207400025172278481715443291693401941467763248672444891029778464850850998910451866532251760265573729603802891979681199941199058262753251051247038814898450192160069049824567851341865948819288467203875175473770134200197684457826486518709881470102852093201457965720215213058487673191409542861896211110569915555788853974841074076366685605058887536260221712351483096796829688703805892797869297796003334770994443794789460259639436865437812910241961445382357524033812312224783435809748252815436505470248482168172542366777257733653560456219150752921112615226017071525633643673264241122463875175583077761780573333101393148223764295110530230833646717923630745738812086412736671406343368298252156032118474543057099651798412740139013104123480347608236951823601336247508674889789494483794628001425344165783788429049730291326775455015785327577865377064397566794918739831414079787693198248140637113125565595305998282580721676261634498566237966614318941397734268015425568890740425312778238252662876746954156253519077411732018085846119889733839268453412968907858943693089597738545774072868871022839381446938075550039536742864199000908389925554691777850180161524332130073243881970286384249150136987633055208076388268958344328919145620288311537387853748176907053434533948744876865239789707206727054699151876690589023127693784859005126867245144990541144502571475179281742590537105515917376706167473011218582298393879651200544930737095993892411425220115292455512046640587174478149165594377091626060310391405243838577142799370503965244703765138756627518023743947119802986986532252546116477951027231307131628103042104039629499919572735529345439335549727142664736202293026484344441050630567027253471369103560266482945879441209004770164675020115476783653466174012741661723993500655369697109626010269380076073933015864761704176611703072139146747597003865521022642104228419619843927108260238084570397138708740181474347163241522446780620603392403687603888076553679045954833871460870755109132271738691459746851320926797113625441143010401758187073392500078061166186149727409676020612731477477496862648324993156390312514509978182394005049176325656482925314334308846020046440000639094498194888324242274543355772503522914560552598223947118463742841515723677871749503874006924229568354106404788800337347740726960903805684221263837486950787248911647072244868181616958029769190594368044110679179639645980860201597430267777459655372871993352465518117174671133742384885531127239604520105123727230849911680326443684000340446147937873667767227624842441390296900995179520080641610292722850119464836580325090471323736225890294980142988595694394073053215895013346101834933981247547372697246437008031025334926870805534589643288626312674442549515696840972195844322623489776395993997725883102424374473386242230020052319139538725050694563793252575203302986006568926586341522483619750551265949811840701660706687971699572637332236706033725130460780147305930796689592739802762127602300331109088320407488753453562201443009583869340530260133192585867600117793558618622877626140608235883463446585052941889282771610713456594091731994663257672424562807919185250771570978748558016087655314386429181778154999037395977801201222536602668579318195917221851258101758083465833807764504478328133760033685582322103480724065531895932039917203779203156040553746346772387443929520551627122239575483559165994485703508677722865190370481258839816840706093115274279356732858077656941579688491810646089766375954256605013212947107680641700379830628558534532701353225658907237335822869646320919937486195881402477347072922997644748078880017641720321497893274887727279247817230724007001520405446788235407924339589275318658718824019308723325037628135839936194865389246778785484224136240513164802724185350906503263939998152201969404224284851353929162842159002494160461334274924788445418313020719064697643073211899597216839617241323956298475147631936745340993794786362122100021070985418754276295234662670333162104340353095385544657319880579379906274682249802800845859334842970692716308206359497045039047894058089399866389624780981978085896624346900360571598520216940381587071285958497155631482721452214648993874243450874956631856720123296440913509093669827146153180469767433504561046437484524515293979237377991209712765962632838588822180359961992788574139615251950913574644651207439995528858114472995911722528828790960400270676875166161939741700924096377882962772526118510149529098157733017933337496630319171190616687753486928733354625068986857196646261563989044574797981270617089057226390794666311751192327631540192548655459578506043592663616062769069836457346194068474176132510064511610117400341310411426000998578144122817400179584819131405912398612085587124626912794546013764785843274068027858995747888172680971572206968091015445337290861835783980747471461015521311208355915962202714480089884097249709377165451728632422251230084667248727648072440251993269156317610868685295846232492883010588697174635533597605834450249882921427658569868883414799635112078926523707047988262628826843234898036034699263633285219983947947102364186704490860419225940767023498819222899748637736136929299603365634669304329289193002180868079267831256753666692578016598885536576757243005565124272778934460000656133474422706312579704797332965888987321865639934115540341358438065159979966516649509059972742742859883148151328808103859578112480441464277834533174833896376621814776042440697291859846516369392086372254665861285937409320474020680208941413993134675771984152737919309617874095184511004441704637414657377204495521150940370391369816136133983987959653102357045282415379947968251076420098012505820501069271733453309150705588274173445852803861126110689326352001921046066346433959229953549279092972503658190837209557302503876248001129441633640343374507764567392795980560783306587466656895994346821030188171996741604459649768510697714192580042040101750692371398942842500442445462269343139517683266487839338542443169246460653530698650325346136357734184681042975047635944793223022235246268651870018710450581435529607254366048869493833744884331399960456341161524764264081615200455615465925723132075411240169896584999493701334792763601560521725937880035580427191600072833098777060365102978298741740559073275852763938780836609797603716875112885764040607658550533844408290490010802790842002942292935369291644839617793990910895308977723653062881593207714109720695034340437197019621968080117519794848132586742911614980669439330348142456126849768719198483462298008318935405664818315956667907954514033766806239587330742325680711653716183320470951491901907421070418246355033490024779722775524553362711286647617964163847164933401979458666304006708368763218332476561345205255639459643444256743045787508311558394991701816915267581835649555296896252897237006404723594796400109216516930136483261469100739753281302804818082275735965571356243205409672153514152830169411991633125429246600926046750109377245075186063774301024268884824103787866848063266853457600668442319180654169447895010411843408292686118099805402852556814966811008369348597110442872837094072059087232837205291461239853639994518924479438927379348327739109781565914159761167665584025124425923844801188360781762018699315163461229173330894272797116474430040071501881164984840886621509629770804885731934408262630754177569630312231904935609457496213783238786007928894185681679202644961896031520772120429456532334651866707926275039616875628244135012101648429121896413946679889877828086708457516884940565793756567939396973544976573326617620245079002790968407887831523704293463842790307287785628353910524550357149296905848302331279051221613790082068853444332742995671850649946821132877723913186786300652152247618157706125750578092402909964449626211673467131785274416643250628726377006207603592185", 8222));
}
public String removeKdigits(String num, int k) {
if (num.length() == k) {
return "0";
}
Deque<Character> deq = new LinkedList<>();
int howmany2cut = k;
char[] numsChar = num.toCharArray();
int finalIndx = 0;
for (int i = 0; i < numsChar.length && k > 0; i++) {
if (deq.isEmpty()) {
deq.add(numsChar[i]);
continue;
}
if (deq.peekLast() <= numsChar[i]) {
deq.add(numsChar[i]);
continue;
}
if (deq.peekLast() > numsChar[i]) {
while (k > 0) {
if (!deq.isEmpty() && (deq.peekLast() > numsChar[i])) {
deq.pollLast();
k--;
} else {
break;
}
}
deq.add(numsChar[i]);
finalIndx = i + 1;
}
}
StringBuilder ans = new StringBuilder();
for (Character n : deq) {
ans.append(n);
}
if (deq.size() < num.length() - k) {
ans.append(num.substring(finalIndx));
}
if (ans.length() > 1) {
for (int i = 0; i < ans.length(); i++) {
if ('0' == ans.charAt(0)) {
ans.delete(0, 1);
} else {
break;
}
}
} else {
return ans.toString();
}
if (ans.length() > 1) {
for (int i = 0; i < ans.length(); i++) {
if ('0' == ans.charAt(0)) {
ans.delete(0, 1);
} else {
break;
}
}
}
if (ans.length() == 0) {
return num.length() - howmany2cut > 0 ? num.substring(0, num.length() - howmany2cut) : "0";
}
if (ans.length() > num.length() - howmany2cut) {
return ans.substring(0, num.length() - howmany2cut);
}
return ans.toString();
}}
here is my debug picture
Please help me , thank you!
The reason why all 0's are not deleting after the first loop is that you are removing elements inside the loop if the first character is zero. Which causing the decrease in ans.length() so due to this the loop is not going up to the full length.
One more thing there is no need for 2 for loops you can manage it with just one loop.
How to fix?
Just store the actual length of ans before beginning the deletion and place it in the loop condition like this
public class No402 {
public static void main(String[] args) {
System.out.println(new No402().removeKdigits("42767854615790820292944831840714943359894187047948450037336809401264092298894490339723170235305129677267060933619172682578764724528024649451075131679109777263591648456729485464839877320061461069243974933498371934575012528555827338953724780861662784034839154178040563249817555067081448332223588411419168442553970020118370358794959779864819714402968003470365044797881527445340976945193818119467023653961507607672480115226579679195083984107550649620824228334531543881248523270728845883011347557806714125988595750797445903460187069102923827814511796767245574859856245433535202213866357865001893279481556044431076323101967578726169437167866864433985495890782177337227185218722003203201794524473658120818757906858018522776715639010350584179192618574032568118118609428514149350137179799798509363342933168141703795277960609902578193965353966732758522319326510476003141627976495471194647651191765940623801848650779996861991716801192868381714592671157213385358454372258678286185038661251898041199455484881497973936886129286780686747702354266676649133047345268803970772136574778724059680910889846701031833468068701979269662983956502485168033946609770137842651146059273082836506077338453677150197865590089199161058651336150874965473699606051616750107442277197178936688141691056518266386172813294511346655182323777419242146803539629808395049965699535272276902817614992917612927025979571436056418178949140225831714010026397581438647144388850448143782384993050908181782121784294922444218824177798052454616802442043385673094510700252387351590505241357656396376170570838637068429512330065547472613577751410152513915714166057883408992271281823592172333654887223386232551975763603851710020471730161184180640812534293795148973065648040320936081719321657015873251252438179935213522036777508405231559635933218588146968578575964379037900738820562221783370763718270548271942160879283346733139062721676158522361533668704462398258010274851756504022170692557968534354343300976925558662656552021225536052236166733671370810493478857779656160557033130699196730596823835866942383406014324343783777539237677792451989779191005800821612057527173069156047746886314264888886920021988864698336973375949221207087151293792642382667520852406157133901720414180577613687865572943934469907502558232579505371542207400025172278481715443291693401941467763248672444891029778464850850998910451866532251760265573729603802891979681199941199058262753251051247038814898450192160069049824567851341865948819288467203875175473770134200197684457826486518709881470102852093201457965720215213058487673191409542861896211110569915555788853974841074076366685605058887536260221712351483096796829688703805892797869297796003334770994443794789460259639436865437812910241961445382357524033812312224783435809748252815436505470248482168172542366777257733653560456219150752921112615226017071525633643673264241122463875175583077761780573333101393148223764295110530230833646717923630745738812086412736671406343368298252156032118474543057099651798412740139013104123480347608236951823601336247508674889789494483794628001425344165783788429049730291326775455015785327577865377064397566794918739831414079787693198248140637113125565595305998282580721676261634498566237966614318941397734268015425568890740425312778238252662876746954156253519077411732018085846119889733839268453412968907858943693089597738545774072868871022839381446938075550039536742864199000908389925554691777850180161524332130073243881970286384249150136987633055208076388268958344328919145620288311537387853748176907053434533948744876865239789707206727054699151876690589023127693784859005126867245144990541144502571475179281742590537105515917376706167473011218582298393879651200544930737095993892411425220115292455512046640587174478149165594377091626060310391405243838577142799370503965244703765138756627518023743947119802986986532252546116477951027231307131628103042104039629499919572735529345439335549727142664736202293026484344441050630567027253471369103560266482945879441209004770164675020115476783653466174012741661723993500655369697109626010269380076073933015864761704176611703072139146747597003865521022642104228419619843927108260238084570397138708740181474347163241522446780620603392403687603888076553679045954833871460870755109132271738691459746851320926797113625441143010401758187073392500078061166186149727409676020612731477477496862648324993156390312514509978182394005049176325656482925314334308846020046440000639094498194888324242274543355772503522914560552598223947118463742841515723677871749503874006924229568354106404788800337347740726960903805684221263837486950787248911647072244868181616958029769190594368044110679179639645980860201597430267777459655372871993352465518117174671133742384885531127239604520105123727230849911680326443684000340446147937873667767227624842441390296900995179520080641610292722850119464836580325090471323736225890294980142988595694394073053215895013346101834933981247547372697246437008031025334926870805534589643288626312674442549515696840972195844322623489776395993997725883102424374473386242230020052319139538725050694563793252575203302986006568926586341522483619750551265949811840701660706687971699572637332236706033725130460780147305930796689592739802762127602300331109088320407488753453562201443009583869340530260133192585867600117793558618622877626140608235883463446585052941889282771610713456594091731994663257672424562807919185250771570978748558016087655314386429181778154999037395977801201222536602668579318195917221851258101758083465833807764504478328133760033685582322103480724065531895932039917203779203156040553746346772387443929520551627122239575483559165994485703508677722865190370481258839816840706093115274279356732858077656941579688491810646089766375954256605013212947107680641700379830628558534532701353225658907237335822869646320919937486195881402477347072922997644748078880017641720321497893274887727279247817230724007001520405446788235407924339589275318658718824019308723325037628135839936194865389246778785484224136240513164802724185350906503263939998152201969404224284851353929162842159002494160461334274924788445418313020719064697643073211899597216839617241323956298475147631936745340993794786362122100021070985418754276295234662670333162104340353095385544657319880579379906274682249802800845859334842970692716308206359497045039047894058089399866389624780981978085896624346900360571598520216940381587071285958497155631482721452214648993874243450874956631856720123296440913509093669827146153180469767433504561046437484524515293979237377991209712765962632838588822180359961992788574139615251950913574644651207439995528858114472995911722528828790960400270676875166161939741700924096377882962772526118510149529098157733017933337496630319171190616687753486928733354625068986857196646261563989044574797981270617089057226390794666311751192327631540192548655459578506043592663616062769069836457346194068474176132510064511610117400341310411426000998578144122817400179584819131405912398612085587124626912794546013764785843274068027858995747888172680971572206968091015445337290861835783980747471461015521311208355915962202714480089884097249709377165451728632422251230084667248727648072440251993269156317610868685295846232492883010588697174635533597605834450249882921427658569868883414799635112078926523707047988262628826843234898036034699263633285219983947947102364186704490860419225940767023498819222899748637736136929299603365634669304329289193002180868079267831256753666692578016598885536576757243005565124272778934460000656133474422706312579704797332965888987321865639934115540341358438065159979966516649509059972742742859883148151328808103859578112480441464277834533174833896376621814776042440697291859846516369392086372254665861285937409320474020680208941413993134675771984152737919309617874095184511004441704637414657377204495521150940370391369816136133983987959653102357045282415379947968251076420098012505820501069271733453309150705588274173445852803861126110689326352001921046066346433959229953549279092972503658190837209557302503876248001129441633640343374507764567392795980560783306587466656895994346821030188171996741604459649768510697714192580042040101750692371398942842500442445462269343139517683266487839338542443169246460653530698650325346136357734184681042975047635944793223022235246268651870018710450581435529607254366048869493833744884331399960456341161524764264081615200455615465925723132075411240169896584999493701334792763601560521725937880035580427191600072833098777060365102978298741740559073275852763938780836609797603716875112885764040607658550533844408290490010802790842002942292935369291644839617793990910895308977723653062881593207714109720695034340437197019621968080117519794848132586742911614980669439330348142456126849768719198483462298008318935405664818315956667907954514033766806239587330742325680711653716183320470951491901907421070418246355033490024779722775524553362711286647617964163847164933401979458666304006708368763218332476561345205255639459643444256743045787508311558394991701816915267581835649555296896252897237006404723594796400109216516930136483261469100739753281302804818082275735965571356243205409672153514152830169411991633125429246600926046750109377245075186063774301024268884824103787866848063266853457600668442319180654169447895010411843408292686118099805402852556814966811008369348597110442872837094072059087232837205291461239853639994518924479438927379348327739109781565914159761167665584025124425923844801188360781762018699315163461229173330894272797116474430040071501881164984840886621509629770804885731934408262630754177569630312231904935609457496213783238786007928894185681679202644961896031520772120429456532334651866707926275039616875628244135012101648429121896413946679889877828086708457516884940565793756567939396973544976573326617620245079002790968407887831523704293463842790307287785628353910524550357149296905848302331279051221613790082068853444332742995671850649946821132877723913186786300652152247618157706125750578092402909964449626211673467131785274416643250628726377006207603592185", 8222));
}
public String removeKdigits(String num, int k) {
if (num.length() == k) {
return "0";
}
Deque<Character> deq = new LinkedList<>();
int howmany2cut = k;
char[] numsChar = num.toCharArray();
int finalIndx = 0;
for (int i = 0; i < numsChar.length && k > 0; i++) {
if (deq.isEmpty()) {
deq.add(numsChar[i]);
continue;
}
if (deq.peekLast() <= numsChar[i]) {
deq.add(numsChar[i]);
continue;
}
if (deq.peekLast() > numsChar[i]) {
while (k > 0) {
if (!deq.isEmpty() && (deq.peekLast() > numsChar[i])) {
deq.pollLast();
k--;
} else {
break;
}
}
deq.add(numsChar[i]);
finalIndx = i + 1;
}
}
StringBuilder ans = new StringBuilder();
for (Character n : deq) {
ans.append(n);
}
if (deq.size() < num.length() - k) {
ans.append(num.substring(finalIndx));
}
int tempLength = ans.length(); //Store length like this
if (ans.length() >= 1) {
for (int i = 0; i < tempLength; i++) { //pass the tempLength as termination condition like this
if ('0' == ans.charAt(0)) {
ans.delete(0, 1);
} else {
break;
}
}
}
if (ans.length() == 0) {
return num.length() - howmany2cut > 0 ? num.substring(0, num.length() - howmany2cut) : "0";
}
if (ans.length() > num.length() - howmany2cut) {
return ans.substring(0, num.length() - howmany2cut);
}
return ans.toString();
}}

Im receiving a String index out of range question for a java program i wrote for my assignment

I would like to apologise in advance if im doing something wrong with the code formatting because this is my second time posting here
I have a java assignment due in a couple of days in which the user enters a string and only the integers are collected from it and placed in the array intArray
Now i think i got the logic right in the code below but when i run it in the main, it asks for the string and the boolean, when i enter both it gives me the error
"Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 115"
This is what i entered for example
"Enter a string and true if you want to skip errors or false if you want to skip errors
sdak23
false"
this is my main:
import java.util.Scanner;
public class MainStringToIntArray {
public static void main(String[] args) {
Scanner intut = new Scanner(System.in);
Scanner input = new Scanner(System.in);
StringToIntArray s1 = new StringToIntArray();
System.out.println("Enter a string and true if you want to skip errors or false if you want to skip errors");
s1.scanStringToIntArray(intut.next(), input.nextBoolean());
}
}
import java.util.Arrays;
import java.util.Scanner;
public class StringToIntArray {
private int[] intArray = new int[10];
public StringToIntArray() {
Arrays.fill(intArray, Integer.MIN_VALUE);
}
public int indexOf(int intToFind) {
int b = 0;
for (int a = 0; a < intArray.length; a++) {
if (intArray[a] == intToFind) {
b = intArray[a];
}
else {
b = -1;
}
}
return b;
}
public int indexOf(String intToFind) {
int b = 0;
for (int a = 0; a < intArray.length; a++) {
if (intArray[a] == Integer.parseInt(intToFind)) {
b = intArray[a];
}
else {
b = -1;
}
}
return b;
}
public boolean contains(int intToFind) {
int a = indexOf(intToFind);
if (a > 0) {
return true;
}
else {
return false;
}
}
public boolean contains(String intToFind) {
int a = indexOf(intToFind);
if (a > 0) {
return true;
}
else {
return false;
}
}
public int get(int index) {
if(index < 0 && index > 10) {
return Integer.MIN_VALUE;
}
else {
return intArray[index];
}
}
public boolean scanStringToIntArray(String s, Boolean skipErrors) {
Boolean result = null;
Scanner input = new Scanner(s);
int l = s.length();
if ((skipErrors)) {
String discard = null;
for (int a = 0; a < l; a++) {
for (int z = 0; z < l; z++) {
if (input.hasNextInt(s.charAt(z))) {
intArray[a] = s.charAt(z);
System.out.println(a);
result = true;
}
else {
discard = discard + s.charAt(z);
}
}
}
}
else {
for (int v = 0; v < l; v++) {
for (int p = 0; p < l; p++) {
if ((input.hasNextInt(s.charAt(p)))) {
intArray[v] = s.charAt(p);
System.out.println(v);
}
else {
System.out.println(v);
result = false;
}
}
}
}
return result;
}
}
The issue is in the get method. It is logically impossible for the index to be both less than 0 and greater than 10; you probably want to use the logical or operator (||). Also, the maximum index of the array is actually 9, as arrays are zero indexed.
public int get(int index) {
if(index < 0 || index > 9) {
return Integer.MIN_VALUE;
}
else {
return intArray[index];
}
}
There are other logical errors in your code as well. All your indexOf methods should be returning the index where the element was first found instead of the element itself and your else branch is always resetting it to -1 each time it is not found.

I'm trying to perform integer division on numbers greater than size of any data type available

As far big numbers are concerned, i know there is a class available in java BigInteger, but i have a constraint that i can't use this and i have to perform division without using library.
This is what i have tried so far, but got memory leakage issues and not getting any answer
private Integer getDivisionResult(ArrayList<Integer> first, ArrayList<Integer> second) {
int firstLength = first.size();
int secondLength = second.size();
int counter = 0;
if (firstLength < secondLength) {
return counter;
}
do {
int carry = 0, cursor1 = firstLength - 1, cursor2 = secondLength - 1;
for (int i = firstLength - 1; i >= 0; i--, cursor1--, secondLength--) {
int value = 0, from = 0;
from = first.get(cursor1) - carry;
if (from < (cursor2 < 0 ? 0 : second.get(cursor2))) {
if (cursor1 > 0) {
from = 10 + from;
}
carry = 1;
} else {
carry = 0;
}
value = from - (cursor2 < 0 ? 0 : second.get(cursor2));
first.set(i, value);
}
counter++;
}while (isLesserThan(second,first));
return counter;
}
private boolean isLesserThan(ArrayList<Integer> list, ArrayList<Integer> firstList) {
boolean result = true;
if (list.size() < firstList.size()) {
return true;
}
for (int i = 0; i < list.size(); i++) {
if (firstList.get(i) > list.get(i)) {
result = true;
break;
} else if (firstList.get(i) == list.get(i)) {
continue;
} else {
result = false;
break;
}
}
return result;
}
I'm calling getDivisionResult inside this method, after passing certain error cases:
/**
* #param numOne
* #param numTwo
* #return sign : true (negative) , false (positive)
*/
public Result getResult(String numOne, String numTwo) {
Result result = new Result();
int res = 0;
boolean sign = false;
ArrayList<Integer> firstNum;
ArrayList<Integer> secondNum;
if (isNegative(numOne)) {
firstNum = getArray(numOne.substring(1));
if (isNegative(numTwo)) {
sign = false;
secondNum = getArray(numTwo.substring(1));
} else {
secondNum = getArray(numTwo);
sign = true;
}
} else {
firstNum = getArray(numOne);
if (isNegative(numTwo)) {
sign = true;
secondNum = getArray(numTwo.substring(1));
} else {
secondNum = getArray(numTwo);
}
}
if (isNull(secondNum)) {
result.setSign("Division by 0 is not permissable");
result.setValue(res);
return result;
} else {
if (isNull(firstNum)) {
result.setSign("");
result.setValue(res);
return result;
}
firstNum = getNumberWithoutZeroes(firstNum);
secondNum = getNumberWithoutZeroes(secondNum);
res = getDivisionResult(firstNum, secondNum);
if (sign) {
result.setSign("-");
} else {
result.setSign("");
}
result.setValue(res);
}
return result;
}
private ArrayList<Integer> getNumberWithoutZeroes(ArrayList<Integer> num) {
ArrayList<Integer> list = new ArrayList<>();
for (Integer x : num) {
if (x == 0) {
continue;
} else {
list.add(x);
}
}
return list;
}
private boolean isNegative(String num) {
boolean result = false;
if (num.startsWith("-")) {
result = true;
}
return result;
}
private boolean isNull(ArrayList<Integer> num) {
boolean result = true;
for (Integer x : num) {
if (x > 0) {
result = false;
}
}
return result;
}
private ArrayList<Integer> getArray(String num) {
ArrayList<Integer> list = new ArrayList<>();
char[] arr = num.toCharArray();
for (int i = 0; i < num.length(); i++) {
list.add(Integer.valueOf(arr[i]));
}
return list;
}
if someone can help me to give a better solution to my problem, I would be grateful
I've made the solution to my own problem, but the problem now is its processing speed.

repetitive element in array algorithm

Can someone help me find the error in my logic for the following code?
I am supposed to print out the array elements only once (value vise)
public class dfdf
{
public static void main(String...args)
{
System.out.println(args.length);
String a= "1234512";
for(int i = 0; i < a.length(); i++)
{
for(int j = 0; j <= (i); j++)
{
if (i == 0)
{
System.out.print(a.charAt(i)); break;
}
else if (a.charAt(j) == a.charAt(i))
{
break;
}
else
{
System.out.print(a.charAt(i));}
}
}
}
}
}
desired output=12345 real output-123344455552
public static void main(String args[]){
String a="1234512";
for(int i=0;i<a.length();i++){
boolean already = false;
for(int j = i - 1; j >= 0; --j){
if(a.charAt(j)==a.charAt(i)){
already = true;
break;
}
}
if(already == false){
System.out.print(a.charAt(i));
}
}
}

How to know if a given string is substring from another string in Java

Hi
I have to compute if a given string is substring of a bigger string.
For example
String str = "Hallo my world";
String substr = "my"
The method "contains" should return true because str contains substr (false otherwise).
I was looking for something like "contains" at the String class
but I didn't find it. I suppose that the only solution is to use
pattern matching. If this is the case which would be the better (cheapest) way
to do this?
Thanks!
There is a contains() method! It was introduced in Java 1.5. If you are using an earlier version, then it's easy to replace it with this:
str.indexOf(substr) != -1
String str="hello world";
System.out.println(str.contains("world"));//true
System.out.println(str.contains("world1"));//false
Javadoc
String s = "AJAYkumarReddy";
String sub = "kumar";
int count = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == sub.charAt(count)) {
count++;
} else {
count = 0;
}
if (count == sub.length()) {
System.out.println("Sub String");
return;
}
}
use indexOf it will return -1 if no match (contains was added in 1.5, maybe you are using older jdk?) see "contains(CharSequence s)" method in String class in JDK 1.4.2 for details
if (str.indexOf(substr) >= 0) {
// do something
}
I think there is a String function that does just what you are asking: String.indexOf(String).
See this link: http://download.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#indexOf(java.lang.String)
So, then you could write this function:
public boolean isSubstring(String super, String sub) {
return super.indexOf(sub) >= 0;
}
String.indexOf(substr) complexity is O(n2).. Luixv asked a cheaper solution.. But as far as , I know there is no better algorithm than current one.
public boolean isSubString(String smallStr, String largerStr) {
char[] larger = largerStr.toCharArray();
char[] smaller = smallStr.toCharArray();
int i = 0;
for (int j = 0; j < larger.length; j++) {
if(larger[j] == smaller[i]){
if(i == smaller.length -1){
//done we found that this string is substring
return true;
}
i++;
continue;
}else{
if(i > 0){
//that means we encountered a duplicate character before and if string was substring
// it shouldn't have hit this condition..
if(larger.length - j >= smaller.length){
i = 0;
//reset i here because there are still more characters to check for substring..
}else{
//we don't have enough characters to check for substring.. so done..
return false;
}
}
}
}
return false;
}
here is a general method that you can use
public static boolean isSubstring(String s1, String s2) {
if(s1.length() == s2.length())
return s1.equals(s2);
else if(s1.length() > s2.length())
return s1.contains(s2);
else
return s2.contains(s1);
}
public static boolean isSubstring(String s1, String s2){
if(s1.length()<s2.length()) return false;
if(s1.length()==s2.length()) return s1.equals(s2);
for(int i=0;i<=s1.length()-s2.length();i++){
if(s1.charAt(i)==s2.charAt(0)){
int matchLength=1;
for(int j=1;j<s2.length();j++){
if(s1.charAt(i+j)!=s2.charAt(j)){
break;
}
matchLength++;
}
if(matchLength==s2.length()) return true;
}
}
return false;
}
This checks if s2 is a substring of s1.
You can use .substring(int beginIndex,int lastIndex) to check this program. Sample code goes as below:-
public class Test {
public static void main(final String[] args) {
System.out.println("Enter the first String");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
String s1 = br.readLine();
System.out.println("Enter the second String");
String s2 = br.readLine();
boolean result = isSubStr(s1, s2);
if (result == true)
System.out.println("The second String is substring of the first String");
else
System.out.println("The second String is not a substring of the first String");
} catch (IOException e) {
System.out.println("Exception Caught: " + e);
}
}
public static boolean isSubStr(String st1, String s2) {
boolean result = false;
String tem_str = "";
int len1 = st1.length();
int i = 0;
int j;
while (i < len1) {
j = i+1;
while (j <=len1) {
tem_str = st1.substring(i, j);
if (tem_str.equalsIgnoreCase(s2)) {
result = true;
break;
}
j++;
}
i++;
}
return result;
}
}
Go through this method.
visit for tricky code
public static boolean isSubString(String s, String sub) {
int count = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == sub.charAt(count)) {
count++;
} else {
i-=count;
count = 0;
}
if (count == sub.length()) {
return true;
}
}
return false;
}
Consider the following code:
If substring is present then it returns the start index of substring in a given string
Else returns -1
public static int isSubstring(String str, String pattern)
{
int str_length = str.length();
int pattern_length = pattern.length();
for (int i = 0; i <= str_length - pattern_length; i++)
{
int j;
for (j = 0; j < pattern_length; j++)
if (str.charAt(i + j) != pattern.charAt(j))
break;
if (j == pattern_length)
return i;
}
return -1;
}
String str1 = "Java8 makes Java more powerful";
String str2 = "Java";
char c;
char d;
int count=0;
boolean match = true;
for (int i = 0; i < str1.length(); i++) {
c = str1.charAt(i);
for (int j = 0; j < str2.length(); j++) {
d = str2.charAt(j);
if (c == d) {
match = true;
count++;
if(count== str2.length()){
i = str1.length();
break;
}
i++;
c = str1.charAt(i);
} else {
match = false;
}
}
}
if(match == true){
System.out.println("SubString ");
}
public class StringIsSubString {
public static void main(String[] args) {
String s1 = "wel";
String s2 = "12wlecome123";
boolean isSubStr = isSubStr(s1,s2);
System.out.println(isSubStr);
}
private static boolean isSubStr(String s1, String s2) {
String s3 = "";
int j = 0;
if(s1.length() > s2.length()) {
return false;
} else if(s1.equals(s2)){
return true;
} else {
for(int i=0; i<s1.length();i++) {
for(; j<s2.length();j++) {
if(s1.charAt(i) == s2.charAt(j)) {
s3 = s3 + s1.charAt(i);
break;
}
}
}
if(s3.equals(s1)) {
return true;
}
return false;
}
}
}
*In their any sub string will be count by the form of 1th place of string of substring *
int isSubstring(string s1, string s2) {
int M = s1.length();
int N = s2.length();
for (int i = 0; i <= N - M; i++) {
int j;
for (j = 0; j < M; j++)
if (s2[i + j] != s1[j])
break;
if (j == M)
return i;
}
return -1;
}
int main() {
string s1 = "kumar";
string s2 = "abhimanyukumarroy";
int res = isSubstring(s1, s2);
if (res == -1)
cout << "Not present";
else
cout << "Present at index " << res;
return 0;
}

Categories