牛牛特别喜欢数字8,在他面前有一个很长的数字串,虽然他不能使所有的数字都变成8,但是他可以通过删去一些字符,使得剩下的数字串能够被8整除。
但是这个数字串太长了,牛牛无法解决该问题,所以他想请你帮忙解决这个问题。
给定一个只由数字包含的字符串,如果能够通过删去一些字符后剩下的字符串能够被8整除,返回"YES",否则,返回"NO"。
题解:这里一个最重要的性质就是,一个能被8整除的数其后三位一定能被8整除。
所以我们只需要每次取三个数,只要这三个数组成的数能被8整除,那么就可以了,返回"YES";如果一直不满足,就返回"NO"。
时间复杂度
空间复杂度
/**
* 如果能够通过删去一些字符后剩下的字符串能够被8整除,返回"YES",否则,返回"NO"
* @param s string字符串 代表该数字字符串
* @return string字符串
*/
string solve(string s)
{
// write code here
int len = s.size();
for (int i = 0; i < len; ++i)
{
if (s[i] == '8' || s[i] == '0')
{
return "YES";
}
for (int j = i + 1; j < len; ++j)
{
int b = (s[i] - '0') * 10 + s[j] - '0';
if (b % 8 == 0)
{
return "YES";
}
for (int k = j + 1; k < len; ++k)
{
int temp = (s[i] - '0') * 100 + (s[j] - '0') * 10 + s[k] - '0';
if (temp % 8 == 0)
{
return "YES";
}
}
}
}
return "NO";
}只不过上述解法只适用于范围较小的时候,比如100以内。我们还可以使用贪心解法。
时间复杂度:
空间复杂度:
参考代码如下:
import java.util.*;
public class Solution {
/**
* 如果能够通过删去一些字符后剩下的字符串能够被8整除,返回"YES",否则,返回"NO"
* @param s string字符串 代表该数字字符串
* @return string字符串
*/
public String solve (String s) {
// write code here
int i,j,k;
for(i=0;i<s.length();i++){
if((s.charAt(i)-'0')%8==0)return "YES";
}
for(i=s.length()-1;i>=0;i--){
if(s.charAt(i)=='4')break;
}
if(i>0) {
for(j=i-1;j>=0;j--) {
if(s.charAt(j)=='6'||s.charAt(j)=='2')return "YES";
}
for(j=i-1;j>=0;j--) {
if((s.charAt(j)-'0')%4==0)break;
}
if(j>=0) {
for(k=j-1;k>=0;k--) {
if((s.charAt(k)-'0')%2==1)return "YES";
}
}
}
for(i=s.length()-1;i>=0;i--){
if(s.charAt(i)=='2')break;
}
if(i>0) {
for(j=i-1;j>=0;j--) {
if(s.charAt(j)=='3'||s.charAt(j)=='7')return "YES";
}
for(j=i-1;j>=0;j--) {
if((s.charAt(j)-'0')%4==1)break;
}
if(j>=0) {
for(k=j-1;k>=0;k--) {
if((s.charAt(k)-'0')%2==1)return "YES";
}
}
}
for(i=s.length()-1;i>=0;i--){
if(s.charAt(i)=='6')break;
}
if(i>0) {
for(j=i-1;j>=0;j--) {
if(s.charAt(j)=='1'||s.charAt(j)=='9')return "YES";
}
for(j=i-1;j>=0;j--) {
if((s.charAt(j)-'0')%4==3)break;
}
if(j>=0) {
for(k=j-1;k>=0;k--) {
if((s.charAt(k)-'0')%2==1)return "YES";
}
}
}
return "NO";
}
}
京公网安备 11010502036488号